OpenCV教程(45) harris角的检测(3)

时间:2021-05-21 07:25:13

      在前面一篇教程中,我们通过取局部最大值的方法来处理检测结果,但是从图像中可以看到harris角的分布并不均匀,在纹理颜色比较深的地方检测的harris角结果更密集一些。本章中,我们使用一个简单的策略算法,首先在检测的harris角图像中,找到一个值最大的角,后面的最大值角检测至少要和前面的角有一个距离,这样循环查找角,直到得到指定数目的角位置。

     在OpenCV中,我们可以通过下面的代码得到结果:

// Compute good features to track
std::vector<cv::Point2f> corners;
cv::goodFeaturesToTrack(image,corners,
    500,    // maximum number of corners to be returned
    0.01,    // quality level
    10);    // minimum allowed distance between points

      500是我们需要的harris角数目,0.01是quality level,用作二值化harris角图像,10是两个harris之间的距离。检测结果放在corners中,我们可以在原图像中,显示这些角,可以看到这些角的分布要均匀很多。

    注意,这个方法默认使用Shi and C方法判断定角。Good Features to Track,1994, J. Shi and C。

    在harris角检测中,我们判断R值的大小,OpenCV教程(45) harris角的检测(3),但在Shi and C的角检测算法中,我们使用公式OpenCV教程(45) harris角的检测(3),R小于某个阈值,才会判断给区域存在角。当然在cv::goodFeaturesToTrack中,你也可以指定使用harris方法判定角。

OpenCV教程(45) harris角的检测(3)

我们也可以使用下面的代码得到相同的结果:

// vector of keypoints
std::vector<cv::KeyPoint> keypoints;
// Construction of the Good Feature to Track detector
cv::GoodFeaturesToTrackDetector gftt(
    500,   // maximum number of corners to be returned
    0.01,   // quality level
    10);    // minimum allowed distance between points
// point detection using FeatureDetector method
gftt.detect(image,keypoints);

cv::drawKeypoints(image,        // original image
    keypoints,                    // vector of keypoints
    image,                        // the resulting image
    cv::Scalar(255,255,255),    // color of the points
    cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); //drawing flag

OpenCV教程(45) harris角的检测(3)

程序代码:参考FirstOpenCV49

代码下载:http://yunpan.cn/Q4akuTWgAUqqu