Harris corner檢測器

2018-10-11 10:25 更新

目標

在本教程中,您將學習:

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

理論

什么是功能?

  • 在計算機視覺中,通常我們需要在環(huán)境的不同幀之間找到匹配點。為什么?如果我們知道兩個圖像如何相互關聯(lián),我們可以使用這兩個圖像來提取它們的信息。
  • 當我們說匹配點時,我們在一般意義上指的是我們可以輕松識別的場景中的特征。我們稱這些特征為特征。
  • 那么功能有什么特點呢?它必須是唯一可識別的

圖像特征的類型

提到幾個:

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

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

為什么角落如此特別?

  • 因為它是兩個邊的交點,它代表這兩個邊的方向改變的點。因此,圖像的梯度(兩個方向)具有高的變化,可用于檢測它。

它是如何工作的?

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

Harris corner檢測器

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)
  • 由于我們正在尋找具有角落的窗戶,所以我們正在尋找強度變化很大的窗戶。因此,我們必須最大化上述方程,特別是術語:

Harris corner檢測器

  • 使用泰勒擴展

Harris corner檢測器

  • 擴大方程并正確取消:

Harris corner檢測器

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

Harris corner檢測器

  • 可以表示為:

Harris corner檢測器

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

Harris corner檢測器

  • 計算每個窗口的分數(shù),以確定它是否可能包含一個角:

Harris corner檢測器


where:

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

窗口R得分大于某一值的被認為是“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 );
}

結果

原始圖片:

Harris corner檢測器

檢測到的角落被一個小的黑色圓圈包圍

Harris corner檢測器

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號