角點(diǎn)檢測是計(jì)算機(jī)視覺系統(tǒng)中用來獲取圖像特征的一種方法。我們都常說,這幅圖像很有特點(diǎn),但是一問他到底有哪些特點(diǎn),或者這幅圖有哪些特征可以讓你一下子就識別出該物體,你可能就說不出來了。其實(shí)說圖像的特征,你可以嘗試說一下這幅圖有幾個矩形啊幾個圓形啊,有幾條直線啊,當(dāng)然啦,你也可以說一下有幾個角點(diǎn)。

什么是角點(diǎn)?

角點(diǎn)通常被定義為兩條邊的交點(diǎn)。比如,三角形有三個角,矩形有四個角,這些就是角點(diǎn),也是他們叫做矩形、三角形的特征,我們看到一些幾何圖形具有三個角,那么我們便可以脫口而出說這是一個三角形。

上面所說的是嚴(yán)格意義上的角點(diǎn),但是從廣義來說,角點(diǎn)指的是擁有特定特征的圖像點(diǎn),這些特征點(diǎn)在圖像中有具體的坐標(biāo),并具有某些數(shù)學(xué)特征(比如局部最大或最小的灰度)。

圖像特征類型可以被分為三種:

  • 邊緣

  • 角點(diǎn)(感興趣關(guān)鍵點(diǎn))

  • 斑點(diǎn)(感興趣區(qū)域)

角點(diǎn)是個很特殊的存在。如果某一點(diǎn)在任意方向的一個微小的變動都會引起灰度很大的變化,那么我們就可以把該點(diǎn)看做是角點(diǎn)。

Harris 角點(diǎn)檢測

Harris角點(diǎn)檢測是一種直接基于灰度圖的角點(diǎn)提取算法,穩(wěn)定性高,尤其對L型角點(diǎn)(也就是直角)檢測精度高。缺點(diǎn)也是明顯的,就是運(yùn)算速度慢。

OpenCV使用的相應(yīng)函數(shù)是

void cornerHarris( InputArray src, OutputArray dst, int blockSize,int ksize,                    double k, int borderType = BORDER_DEFAULT );

下面給出相應(yīng)的檢測代碼。

#include <opencv2/opencv.hpp>  #include "opencv2/highgui/highgui.hpp"  #include "opencv2/imgproc/imgproc.hpp"  using namespace cv;using namespace std;
 

Mat g_srcImage, g_srcImage1, g_grayImage;int thresh = 30; //當(dāng)前閾值  int max_thresh = 175; //最大閾值  void on_CornerHarris(int, void*);//回調(diào)函數(shù)  int main(int argc, char** argv){
    g_srcImage = imread("lol19.jpg", 1);    if (!g_srcImage.data)
    {        printf("讀取圖片錯誤! \n");        return&