基于OpenCV的harris角点检测

来源:互联网 发布:win7网络连接有个红叉 编辑:程序博客网 时间:2024/05/18 00:13

首先放上一张帝国大厦的测试图片。


Harris角点检测框架是使用偏微分来近似平方差的计算,通过计算微分矩阵的两个特征值来决定是否存在角点特征。例如,当两个特征值均较大时,图像块中有角点特征,仅当其中一个特征值角点,则图像块中存在边缘特征。


GoodFeaturesToTrackDetector harris_detector(1000, 0.01, 10, 3, true);
vector<KeyPoint>keypoints;
harris_detector.detect(gray_img, keypoints);


在OpenCV中,使用GoodFeaturesToTrackDetector 定义一个进行1000个角点检测的Harris角点检测器,使用drawKeypoints函数进行角点绘制。

作者在测试时发现以下两种情况均可以在图像中进行角点绘制。

1)drawKeypoints(Mat(), keypoints, img, CV_RGB(255, 0, 0),-1),在原始的彩色图像img中绘制实心角点,flag参数必须为-1,否则会报错。



2)drawKeypoints(img, keypoints, img, CV_RGB(255, 0, 0), 0),在彩色图像img中进行角点的绘制,第一个参数不能为Mat()的默认构造值。


#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char ** argv){
Mat img = imread("empire.jpg");
//imshow("original", img);
Mat gray_img(img.size(), 1);
cvtColor(img, gray_img, CV_BGR2GRAY);


GoodFeaturesToTrackDetector harris_detector(1000, 0.01, 10, 3, true);
vector<KeyPoint>keypoints;
harris_detector.detect(gray_img, keypoints);


//drawKeypoints(Mat(), keypoints, img, CV_RGB(255, 0, 0),-1);
drawKeypoints(img, keypoints, img, CV_RGB(255, 0, 0), 0);

imshow("original", img);
imshow("gray", gray_img);
imwrite("harris_corners.jpg", img);
waitKey();


return 0;
}

原创粉丝点击