Harris corner檢測(cè)器

2018-10-11 10:25 更新

目標(biāo)

在本教程中,您將學(xué)習(xí):

  • 什么功能和為什么它們是重要的
  • 使用函數(shù)cv :: cornerHarris使用Harris-Stephens方法檢測(cè)corner。

理論

什么是功能?

  • 在計(jì)算機(jī)視覺(jué)中,通常我們需要在環(huán)境的不同幀之間找到匹配點(diǎn)。為什么?如果我們知道兩個(gè)圖像如何相互關(guān)聯(lián),我們可以使用這兩個(gè)圖像來(lái)提取它們的信息。
  • 當(dāng)我們說(shuō)匹配點(diǎn)時(shí),我們?cè)谝话阋饬x上指的是我們可以輕松識(shí)別的場(chǎng)景中的特征。我們稱這些特征為特征。
  • 那么功能有什么特點(diǎn)呢?它必須是唯一可識(shí)別的

圖像特征的類型

提到幾個(gè):

  • 邊緣
  • 角(也稱為興趣點(diǎn))
  • 斑點(diǎn)(也稱為感興趣區(qū)域)

在本教程中,我們將特別研究角落特征。

為什么角落如此特別?

  • 因?yàn)樗莾蓚€(gè)邊的交點(diǎn),它代表這兩個(gè)邊的方向改變的點(diǎn)。因此,圖像的梯度(兩個(gè)方向)具有高的變化,可用于檢測(cè)它。

它是如何工作的?

  • 讓我們來(lái)看看吧。由于角代表了圖像中漸變的變化,我們將尋找這種“變化”。
  • 考慮一個(gè)灰度圖像I。我們要掃一個(gè)窗口w(x,y)(x位移u和y方向的v)I我將計(jì)算強(qiáng)度的變化。

Harris corner檢測(cè)器

where:

  1. w(x,y) is the window at position (x,y)
  2. I(x,y) is the intensity at (x,y)
  3. I(x+u,y+v) is the intensity at the moved window (x+u,y+v)
  • 由于我們正在尋找具有角落的窗戶,所以我們正在尋找強(qiáng)度變化很大的窗戶。因此,我們必須最大化上述方程,特別是術(shù)語(yǔ):

Harris corner檢測(cè)器

  • 使用泰勒擴(kuò)展

Harris corner檢測(cè)器

  • 擴(kuò)大方程并正確取消:

Harris corner檢測(cè)器

  • 其中可以以矩陣形式表示為:

Harris corner檢測(cè)器

  • 可以表示為:

Harris corner檢測(cè)器

  • 那么現(xiàn)在我們的方程是:

Harris corner檢測(cè)器

  • 計(jì)算每個(gè)窗口的分?jǐn)?shù),以確定它是否可能包含一個(gè)角:

Harris corner檢測(cè)器


where:

  1. det(M) = λ1λ2
  2. trace(M) = λ1+λ2

窗口R得分大于某一值的被認(rèn)為是“corner”

Code

本教程代碼如下所示。您也可以從這里下載

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat src, src_gray;
int thresh = 200;
int max_thresh = 255;
const char* source_window = "Source image";
const char* corners_window = "Corners detected";
void cornerHarris_demo( int, void* );
int main( int, char** argv )
{
  src = imread( argv[1], IMREAD_COLOR );
  cvtColor( src, src_gray, COLOR_BGR2GRAY );
  namedWindow( source_window, WINDOW_AUTOSIZE );
  createTrackbar( "Threshold: ", source_window, &thresh, max_thresh, cornerHarris_demo );
  imshow( source_window, src );
  cornerHarris_demo( 0, 0 );
  waitKey(0);
  return(0);
}
void cornerHarris_demo( int, void* )
{
  Mat dst, dst_norm, dst_norm_scaled;
  dst = Mat::zeros( src.size(), CV_32FC1 );
  int blockSize = 2;
  int apertureSize = 3;
  double k = 0.04;
  cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
  normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
  convertScaleAbs( dst_norm, dst_norm_scaled );
  for( int j = 0; j < dst_norm.rows ; j++ )
     { for( int i = 0; i < dst_norm.cols; i++ )
          {
            if( (int) dst_norm.at<float>(j,i) > thresh )
              {
               circle( dst_norm_scaled, Point( i, j ), 5,  Scalar(0), 2, 8, 0 );
              }
          }
     }
  namedWindow( corners_window, WINDOW_AUTOSIZE );
  imshow( corners_window, dst_norm_scaled );
}

結(jié)果

原始圖片:

Harris corner檢測(cè)器

檢測(cè)到的角落被一個(gè)小的黑色圓圈包圍

Harris corner檢測(cè)器

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)