一、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 );
C

其中,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;
}
C++

上面的代码首先使用 cv::cornerHarris() 函数进行 Harris 角点检测,然后进行归一化,最后在归一化之后的图像上绘制出角点,最终的结果如下图所示:

![Harris 角点检测示例 ](https://img-blog.csdnimg.cn/20200531145140932.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUxMjQyOA==,size_16,color_FFFFFF,t_70)