【OpenCV入门教程之十六】OpenCV角点检测之Harris角点检测

即可以找出输出图中的局部最大值,即找出了角点。

其函数原型和参数解析:

C++: void cornerHarris(InputArray src,OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT )

接着我们一起过一遍稍后需要用到的Threshold函数的解析,然后看一个以cornerHarris为核心的示例程序。

五、Threshold函数详解

函数Threshold( ) 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(另外,compare( )函数也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。

C++: double threshold(InputArray src,OutputArray dst, double thresh, double maxval, int type)

而图形化的阈值描述如下图:

讲解完这两个函数,让我们看一个调用示例程序:

//———————————–【头文件包含部分】————————————— //描述:包含程序所依赖的头文件 //———————————————————————————————- #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> //———————————–【命名空间声明部分】————————————— //描述:包含程序所使用的命名空间 //———————————————————————————————– using namespace cv; int main() { //以灰度模式载入图像并显示Mat srcImage = imread("1.jpg", 0); imshow("原始图", srcImage);//进行Harris角点检测找出角点Mat cornerStrength; cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);//对灰度图进行阈值操作,得到二值图并显示 Mat harrisCorner; threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY); imshow("角点检测后的二值效果图", harrisCorner);waitKey(0); return 0; }

运行截图:

六、本文相关核心函数在OpenCV中的实现源代码

这个部分贴出OpenCV中本文相关函数的源码实现细节,来给想了解实现细节的小伙伴们参考。浅墨暂时不在源码的细节上挖深作详细注释。

6.1 OpenCV2.X中cornerHarris函数源代码

源码路径: …opencv\sources\modules\imgproc\src\corner.cpp

void cv::cornerHarris( InputArray _src,OutputArray _dst, int blockSize, int ksize, double k, int borderType ){ Mat src = _src.getMat(); _dst.create( src.size(), CV_32F ); Mat dst = _dst.getMat(); cornerEigenValsVecs( src, dst, blockSize, ksize, HARRIS, k, borderType);}

可见cornerHarris内部其实是调用了cornerEigenValsVecs函数,我们看看其实现源码:

static voidcornerEigenValsVecs( const Mat& src,Mat& eigenv, int block_size,int aperture_size, intop_type, double k=0.,intborderType=BORDER_DEFAULT ){#ifdef HAVE_TEGRA_OPTIMIZATION if (tegra::cornerEigenValsVecs(src, eigenv, block_size, aperture_size,op_type, k, borderType))return;#endifint depth = src.depth(); double scale = (double)(1 << ((aperture_size > 0 ?aperture_size : 3) – 1)) * block_size; if( aperture_size < 0 )scale *= 2.; if( depth == CV_8U )scale *= 255.; scale = 1./scale;CV_Assert( src.type() == CV_8UC1 || src.type() == CV_32FC1 );Mat Dx, Dy; if( aperture_size > 0 ){Sobel( src, Dx, CV_32F, 1, 0, aperture_size, scale, 0, borderType );Sobel( src, Dy, CV_32F, 0, 1, aperture_size, scale, 0, borderType );} else{Scharr( src, Dx, CV_32F, 1, 0, scale, 0, borderType );Scharr( src, Dy, CV_32F, 0, 1, scale, 0, borderType );}Size size = src.size(); Mat cov( size, CV_32FC3 ); int i, j;for( i = 0; i < size.height; i++ ){float* cov_data = (float*)(cov.data + i*cov.step);const float* dxdata = (const float*)(Dx.data + i*Dx.step);const float* dydata = (const float*)(Dy.data + i*Dy.step);for( j = 0; j < size.width; j++ ){float dx = dxdata[j];float dy = dydata[j];cov_data[j*3] = dx*dx;cov_data[j*3+1] = dx*dy;cov_data[j*3+2] = dy*dy;}}boxFilter(cov, cov, cov.depth(), Size(block_size, block_size),Point(-1,-1), false, borderType );if( op_type == MINEIGENVAL )calcMinEigenVal( cov, eigenv ); else if( op_type == HARRIS )calcHarris( cov, eigenv, k ); else if( op_type == EIGENVALSVECS )calcEigenValsVecs( cov, eigenv );} }

6.1 OpenCV2.X中Threshold函数源代码

路径:…opencv\sources\modules\imgproc\src\thresh.cpp

家门前的那条小路,到底通向了什么样的远方呢?

【OpenCV入门教程之十六】OpenCV角点检测之Harris角点检测

相关文章:

你感兴趣的文章:

标签云: