600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > OpenCV Harris 角点检测子

OpenCV Harris 角点检测子

时间:2020-10-23 07:54:35

相关推荐

OpenCV Harris 角点检测子

目标

本教程中我们将涉及:

有哪些特征?它们有什么用?使用函数cornerHarris通过 Harris-Stephens方法检测角点.

理论

有哪些特征?

在计算机视觉中,我们通常需要寻找两张图上的匹配关键点。为什么?因为一旦我们知道了两张图是相关联的,我们就可以使用 *both图像来提取它们中的信息。

是指

匹配关键点是指在场景中可以很容易识别出来的特性. 这些特性就是这里所说的特征因此,特征应该有什么样的特性呢?应该具有可识别的独一无二性

图像特征类型

图像特征类型:

边缘角点(感兴趣关键点)斑点(Blobs) (感兴趣区域)

本教程涉及角点特征。

为什么角点是特殊的?

因为角点是两个边缘的连接点,它代表了两个边缘变化的方向上的点。图像梯度有很高的变化。这种变化是可以用来帮助检测角点的。

如何工作?

由于角点代表了图像像素梯度变化,我们将寻找这个”变化”。

考虑到一个灰度图像. 划动窗口(with displacements在x方向和方向)计算像素灰度变化。

其中:

is the window at positionis the intensity atis 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 variablesMat src, src_gray;int thresh = 200;int max_thresh = 255;char* source_window = "Source image";char* corners_window = "Corners detected";/// Function headervoid 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@>,http://www.cbsr./users/szheng/

from:.cn/opencvdoc/2.3.2/html/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html#harris-detector

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
扩展阅读