首先进行粗检测,函数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
