OpenCV Harris 角点检测子
生活随笔
收集整理的這篇文章主要介紹了
OpenCV Harris 角点检测子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目標
本教程中我們將涉及:
- 有哪些特征?它們有什么用?
- 使用函數?cornerHarris?通過 Harris-Stephens方法檢測角點.
理論
有哪些特征?
在計算機視覺中,我們通常需要尋找兩張圖上的匹配關鍵點。為什么?因為一旦我們知道了兩張圖是相關聯的,我們就可以使用 *both?圖像來提取它們中的信息。是指
- 匹配關鍵點?是指在場景中可以很容易識別出來的?特性?. 這些特性就是這里所說的?特征?。
- 因此,特征應該有什么樣的特性呢?
- 應該具有?可識別的獨一無二性
圖像特征類型
圖像特征類型:
- 邊緣
- 角點?(感興趣關鍵點)
- 斑點(Blobs) (感興趣區域)
本教程涉及?角點?特征。
為什么角點是特殊的?
- 因為角點是兩個邊緣的連接點,它代表了兩個邊緣變化的方向上的點。圖像梯度有很高的變化。這種變化是可以用來幫助檢測角點的。
如何工作?
-
由于角點代表了圖像像素梯度變化,我們將尋找這個”變化”。
-
考慮到一個灰度圖像?. 劃動窗口??(with displacements??在x方向和??方向)??計算像素灰度變化。
其中:
- ?is the window at position?
- ?is the intensity at?
- ?is the intensity at the moved window?
-
為了尋找帶角點的窗口,我們搜索像素灰度變化較大的窗口。于是, 我們期望最大化以下式子:
-
使用?泰勒(Taylor)展開式:
-
式子可以展開為:
-
一個舉證表達式可以寫為:
-
表示為:
-
因此我們有等式:
-
每個窗口中計算得到一個值。這個值決定了這個窗口中是否包含了角點:
其中:
- det(M) =?
- trace(M) =?
一個窗口,它的分數??大于一個特定值,這個窗口就可以被認為是”角點”
代碼
這個教程的代碼如下所示。還可以通過?這個鏈接下載到源代碼
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h>using namespace cv; using namespace std;/// Global variables Mat src, src_gray; int thresh = 200; int max_thresh = 255;char* source_window = "Source image"; char* corners_window = "Corners detected";/// Function header void cornerHarris_demo( int, void* );/** @function main */ int main( int argc, char** argv ) {/// Load source image and convert it to graysrc = imread( argv[1], 1 );cvtColor( src, src_gray, CV_BGR2GRAY );/// Create a window and a trackbarnamedWindow( source_window, CV_WINDOW_AUTOSIZE );createTrackbar( "Threshold: ", source_window, &thresh, max_thresh, cornerHarris_demo );imshow( source_window, src );cornerHarris_demo( 0, 0 );waitKey(0);return(0); }/** @function cornerHarris_demo */ void cornerHarris_demo( int, void* ) {Mat dst, dst_norm, dst_norm_scaled;dst = Mat::zeros( src.size(), CV_32FC1 );/// Detector parametersint blockSize = 2;int apertureSize = 3;double k = 0.04;/// Detecting cornerscornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );/// Normalizingnormalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );convertScaleAbs( dst_norm, dst_norm_scaled );/// Drawing a circle around cornersfor( 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 );}}}/// Showing the resultnamedWindow( corners_window, CV_WINDOW_AUTOSIZE );imshow( corners_window, dst_norm_scaled ); }解釋
實驗結果
原始圖像:
檢測到的角點被黑色圈標記了
翻譯者
Shuai Zheng, <kylezheng04@gmail.com>,?http://www.cbsr.ia.ac.cn/users/szheng/
from:?http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html#harris-detector
總結
以上是生活随笔為你收集整理的OpenCV Harris 角点检测子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简明python教程 --C++程序员的
- 下一篇: OpenCV 特征点检测