c语言 角点检测,OpenCV入门教程之十六 OpenCV角点检测之Harris角点检测

本文介绍了使用OpenCV进行Harris角点检测的C++实现,包括`cornerHarris`函数的调用示例,源码解析以及与`threshold`函数的结合使用。通过调整阈值,可以控制检测到的角点数量。文章还提供了完整的源代码示例,展示了如何在图像中实时调整阈值并显示角点检测结果。
摘要由CSDN通过智能技术生成

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

//-----------------------------------【头文件包含部分】---------------------------------------

// 描述:包含程序所依赖的头文件

//----------------------------------------------------------------------------------------------

#include

#include

//-----------------------------------【命名空间声明部分】---------------------------------------

// 描述:包含程序所使用的命名空间

//-----------------------------------------------------------------------------------------------

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;

}

运行截图:

f552168962dd973d8bffd23c74490158.png

2d1db5b6645e1d55a6a2d8a24c3627f4.png

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

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

6.1 OpenCV2.X中cornerHarris函数源代码

源码路径: …opencvsourcesmodulesimgprocsrccorner.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 void

cornerEigenValsVecs( 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;

#endif

int 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值