小白学视觉,笔记,扩展
Harris存在的弊端,
提出Shi-Tomas
#include#include using namespace cv; using namespace std; int main() { Mat img = imread("lena.png"); if (!img.data) { cout << "读取图像错误,请确认图像文件是否正确" << endl; return -1; } Mat gray,img2; img.copyTo(img2); cvtColor(img, gray, COLOR_BGR2GRAY); // Detector parameters //提取角点 int maxCorners = 100; //检测角点数目 double quality_level = 0.01; //质量等级,或者说阈值与最佳角点的比例关系 double minDistance = 0.04; //两个角点之间的最小欧式距离 vector corners; goodFeaturesToTrack(gray, corners, maxCorners, quality_level, minDistance, Mat(), 3, false); //绘制角点 vector keyPoints; //存放角点的KeyPoint类,用于后期绘制角点时用 RNG rng(10086); for (int i = 0; i < corners.size(); i++) { //第一种绘制角点方法,用circle()函数绘制角点 int b = rng.uniform(0, 256); int g = rng.uniform(0, 256); int r = rng.uniform(0, 256); circle(img, corners[i], 5, Scalar(b,g,r),2,8,0); //将角点存放在KeyPoint类中,用于第二种绘制方式使用 KeyPoint keyPoint; keyPoint.pt = corners[i]; keyPoints.push_back(keyPoint); } //第二种方式绘制角点,用drawKeypoints()函数绘制角点坐标 drawKeypoints(img2, keyPoints, img2); imshow("用circle()绘制角点", img); imshow("用drawKeypoints()函数绘制角点", img2); waitKey(0); return 0; }
分别用circle()函数,drawKeypoints()函数绘制角点,进行对比;
circle()可自由调整圆的大小和颜色,但需多次调用,时间复杂度高;
drawKeypoints()函数绘,圆大小固定,实现方便简单,一次调用完成。



