goodFeaturesToTrack (Shi-Tomasi) 或 Harris 檢測的角點精度僅限像素級。cornerSubPix 通過迭代擬合將角點精度提升至亞像素級。
void cornerSubPix(InputArray image, InputOutputArray corners,
Size winSize, Size zeroZone, TermCriteria criteria);
image:灰度圖。corners:輸入初始角點,輸出優化後角點(Point2f 向量)。winSize:搜索窗口半尺寸,如 Size(5,5) 即 11×11 窗口。zeroZone:中心排除區,通常 Size(-1,-1) 表示不排除。criteria:迭代終止條件,TermCriteria(COUNT+EPS, 40, 0.001)。Mat src = imread("house.jpg"), gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
vector corners;
goodFeaturesToTrack(gray, corners, 10, 0.01, 10); // 初檢測
Mat disp1 = src.clone(), disp2 = src.clone();
for (auto p : corners) circle(disp1, p, 3, Scalar(255,0,255), -1);
imshow("Before", disp1);
cornerSubPix(gray, corners, Size(5,5), Size(-1,-1),
TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 40, 0.001));
for (auto p : corners) circle(disp2, p, 3, Scalar(255,0,255), -1);
imshow("After", disp2);
waitKey(0);
優化前後角點坐標從整數變為浮點數,視覺上更貼合圖像梯度極值。適用於相機標定、縫合等高精度場景。