一、Harris角点检测简介
Harris角点检测(Harris Corner Detection)是一种基于图像像素灰度变化的角点检测算法,由Christopher M. Harris和Michael Stephens于1988年提出,它可以有效地检测图像中的角点。Harris角点检测的思想是在一个窗口内,利用像素灰度变化的矩阵来检测角点,它可以检测出图像中具有明显变化的区域。
二、OpenCV中Harris角点检测的实现
OpenCV中实现Harris角点检测的函数是cv::cornerHarris(),它的原型如下:
void cv::cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType=BORDER_DEFAULT );
其中,src为输入图像,dst为输出图像,blockSize为窗口大小,ksize为Sobel算子的大小,k为Harris参数,borderType为边界模式。
三、实现示例
下面是一个使用OpenCV实现Harris角点检测的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat src = imread("image.jpg");
Mat dst, dst_norm, dst_norm_scaled;
dst = Mat::zeros(src.size(), CV_32FC1);
// 使用Harris角点检测
cornerHarris(src, 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_norm.rows; i++)
{
for (int j = 0; j < dst_norm.cols; j++)
{
if ((int)dst_norm.at<float>(i, j) > 200)
{
circle(dst_norm_scaled, Point(j, i), 5, Scalar(0), 2, 8, 0);
}
}
}
imshow("src", src);
imshow("dst_norm_scaled", dst_norm_scaled);
waitKey(0);
return 0;
}
上面的代码首先使用cv::cornerHarris()函数进行Harris角点检测,然后进行归一化,最后在归一化之后的图像上绘制出角点,最终的结果如下图所示:
