首先进行粗检测,函数goodFeaturesToTrack,存储进入corners中,然后cornerSubPix函数进行亚像素精确匹配,设置结束条件。
由于实际应用中线条较粗,因此
CORNER_BLOCKSIZE = 9;
CORNER_QUALITYLEVEL = 0.6;
其他参数可以微调。
std::vector<cv::Point2f> corners;
//double qualityLevel = 0.5;
double minDistance = 10;
int blockSize = CORNER_BLOCKSIZE, gradientSize = CORNER_BLOCKSIZE;
bool useHarrisDetector = true;
double k = 0.04;
cv::Mat copy = img3.clone();
cv::goodFeaturesToTrack( copy,
corners,
MAX_CORNERS,
CORNER_QUALITYLEVEL,
minDistance,
cv::Mat(),
blockSize,
gradientSize,
useHarrisDetector,
k );
int radius = 4;
for( size_t i = 0; i < corners.size(); i++ )
{
cv::circle( copy, corners[i], radius, cv::Scalar(rng.uniform(0,255), rng.uniform(0, 256), rng.uniform(0, 256)), cv::FILLED );
}
cv::TermCriteria criteria = cv::TermCriteria(
cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,
40,
0.001);
cv::cornerSubPix(img3, corners, cv::Size(CORNER_BLOCKSIZE, CORNER_BLOCKSIZE), cv::Size(-1, -1), criteria);
for (int i = 0; i < corners.size(); i++)
{
cv::circle(img3, corners[i], radius, cv::Scalar(rng.uniform(0,255), rng.uniform(0, 256), rng.uniform(0, 256)), cv::FILLED );
}
参考:https://docs.opencv.org/master/dd/d92/tutorial_corner_subpixels.html