官方代码:
#include <opencv2/opencv.hpp>
using namespace cv;
Mat src, src_gray;
//设置阈值变量
int thresh = 150;
int thresh_max = 255;
//回调函数
void on_cornerHarris_demo(int,void*);
//窗口名
const char* src_window = "src";
int main()
{
//读取图片
src = imread("test.jpg");
//转为灰度图
cvtColor(src, src_gray, COLOR_RGB2GRAY);
namedWindow(src_window);
//创建滑动条
createTrackbar("Threshold: ", src_window, &thresh, thresh_max, on_cornerHarris_demo);
//显示原图片
imshow(src_window, src);
//调用demo
on_cornerHarris_demo(0, 0);
waitKey(0);
return 0;
}
void on_cornerHarris_demo(int, void *)
{
Mat dst, dst_norm, dst_norm_scaled;
dst = Mat::zeros(src.size(), CV_32FC1);
//harris检测
cornerHarris(src_gray, dst, 2, 3, 0.04, BORDER_DEFAULT);
//归一化
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
//控制范围
convertScaleAbs(dst_norm, dst_norm_scaled);
//将检测出来的角点标记
for (int i = 0; i < dst.rows; i++)//行
for (int j = 0; j < dst.cols; j++)//列
if (int(dst_norm.at<float>(i, j) > thresh))
circle(dst_norm_scaled, Point(j, i), 3, Scalar(255, 255, 0), 2, 8, 0);//坐标相反
//显示结果
imshow("dst", dst_norm_scaled);
}