1 #include <opencv2/opencv.hpp>
2 #include <iostream>
3
4 using namespace cv;
5 using namespace std;
6 Mat src, gray_src;
7 int thresh = 130;
8 int max_count = 255;
9 const char* output_title = "HarrisCornerDetection Result";
10 void Harris_Demo(int, void*);
11 int main(int argc, char** argv) {
12
13 src = imread("L:/6.jpg");
14 if (src.empty()) {
15 printf("could not load image...\n");
16 return -1;
17 }
18 namedWindow("input image", CV_WINDOW_AUTOSIZE);
19 imshow("input image", src);
20
21 namedWindow(output_title, CV_WINDOW_AUTOSIZE);
22 cvtColor(src, gray_src, COLOR_BGR2GRAY);
23 createTrackbar("Threshold:", output_title, &thresh, max_count, Harris_Demo);
24 //&thresh为滑动窗口初始默认值130
25 Harris_Demo(0, 0);
26
27 waitKey(0);
28 return 0;
29 }
30
31 void Harris_Demo(int, void*) {
32 Mat dst, norm_dst, normScaleDst;
33 dst = Mat::zeros(gray_src.size(), CV_32FC1);
34
35 int blockSize = 2;
36 int ksize = 3;
37 double k = 0.04;
38 cornerHarris(gray_src, dst, blockSize, ksize, k, BORDER_DEFAULT);
39 //参数:输入灰度图像,输出图像,blockSize参数矩阵的大小,ksize窗口大小,k角度响应参数0.04-0.06, 默认
40 normalize(dst, norm_dst, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
41 //归一化函数:NORM_MINMAX为一般常用的方法,CV_32FC1 输出矩阵与输入矩阵类型相同
42 convertScaleAbs(norm_dst, normScaleDst);
43 //对矩阵取绝对值
44
45 Mat resultImg = src.clone();
46 // 克隆彩色图片src到resultImg
47
48 for (int row = 0; row < resultImg.rows; row++) {
49 uchar* currentRow = normScaleDst.ptr(row); //行指针,指向一行的数据
50 for (int col = 0; col < resultImg.cols; col++) {
51 int value = (int)*currentRow; //通过指针拿出数据值
52 if (value > thresh) {
53 circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0);
54 //画圆
55 }
56 currentRow++;
57 }
58 }
59
60 imshow(output_title, resultImg);
61 }
知识兔效果: