OpenCV各模块函数使用实例(5)--特征检测(Feature Detection)

本文详细介绍了OpenCV库中的特征检测函数,包括Canny边缘检测、Harris和Shi-Tomasi角点检测、亚像素级角点定位、线段检测和霍夫变换。这些函数用于识别图像中的关键特征,如边缘、角点、直线和圆,是计算机视觉中的重要工具。示例代码和图像展示了不同函数在实际应用中的效果,帮助理解其工作原理和参数调整对结果的影响。

特征检测是检测图像中的特征信息,比如边缘,线段,角点位置等。在OpenCV中提供了各种特征检测函数和特征提取函数,其中包括有边缘检测(canny),角点检测等,如:Harris角点、ShiTomasi角点、亚像素级角点、SURF角点、Star关键点、FAST关键点、Lepetit关键点等等。下面将对特征检测模块中的检测函数的使用进行解释,主要来源于OpenCV的帮助文档(翻译)和网络上的资料摘编,并包含C++编程说明和图像处理的效果说明。

  • void cv::Canny (InputArray image, OutputArray edges,

double threshold1, double threshold2,

int apertureSize=3, bool L2gradient=false)

void cv::Canny (InputArray dx, InputArray dy, OutputArray edges,

double threshold1, double threshold2, bool L2gradient=false)

使用Canny算法查找图像中的边缘。

这个函数使用Canny算法查找输入图像的边缘并在输出图像中标记这些边缘图。threshold1threshold2之间的最小值用于边缘的连接。最大值用于查找强边缘的起始线段。

参数

image

8-位输入图像

edges

输出的边缘图,单通道8位图像,与源图同尺寸

threshold1

迟滞过程的第一个阈值

threshold2

迟滞过程的第二个阈值

apertureSize

Sobel算子的滤镜尺寸

L2gradient

标志,表示是用更精确的L2 norm =  来计算图像的梯度大小( L2gradient=true ), 还是用默认的 L1 norm =就足够了( L2gradient=false )

  • void cv::cornerEigenValsAndVecs (InputArray src, OutputArray dst,

int blockSize, int ksize, int borderType=BORDER_DEFAULT)

计算图块的特征值和特征矢量,用于角点检测。

对每一个像素点p,函数cornerEigenValsAndVecs 考虑blockSize × blockSize邻域S(p) 。计算邻域上导数的协方差矩阵:

                        

 其中导数使用Sobel算子计算。

然后,函数查找M的特征矢量和特征值并存储成目标图像,如(λ1,λ2,x1,y1,x2,y2) 此处

  • λ1,λ2 为M非排序的特征值
  • x1,y1 是对应λ1的特征矢量
  • x2,y2 是对应 λ2的特征矢量

这个函数的输出可用于强边和角的检测。

参数

src

输入单通道8位或浮点图像

dst

存储结果的目标图像。与源图有相同的尺寸,而类型为CV_32FC(6)

blockSize

邻域尺寸

ksize

Sobel算子的滤镜参数

borderType

边框模式,用于外推图像以外的像素,参见 BorderTypes。不支持BORDER_WRAP 。

参见

cornerMinEigenValcornerHarrispreCornerDetect

  • void cv::cornerHarris (InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType=BORDER_DEFAULT)

Harris角点检测器。

这个函数在图像上运行Harris角检测器。类似于cornerMinEigenVal cornerEigenValsAndVecs ,对每一个点(x,y) ,计算blockSize×blockSize 邻域上的2×2 梯度协方差矩阵。然后计算下面的特征值:

                 

图像中的角作为响应的局部最大值就能被找到。

参数

Src

输入单通道8位或浮点图像。

Dst

存储检测器响应的目标图像。其类型为CV_32FC1且与源图同尺寸。

blockSize

邻域尺寸(详见cornerEigenValsAndVecs)。

Ksize

Sobel算子的滤镜参数。

K

Harris检测器的自由参数。见上面的公式。

borderType

边框模式,用于外推图像以外的像素,参见 BorderTypes。不支持BORDER_WRAP 。

  • void cv::cornerMinEigenVal (InputArray src, OutputArray dst,

int blockSize, int ksize=3, int borderType=BORDER_DEFAULT)

计算梯度矩阵的最小特征值用于角点检测。

这个函数类似于cornerEigenValsAndVecs,但它仅计算并存储导数协方差矩阵的最小特征值,即,在cornerEigenValsAndVecs函数的公式描述中的min(λ1,λ2)

参数

src

输入单通道8位或浮点图像。

dst

存储最小特征值的目标图像。类型为CV_32FC1 并与源图像同尺寸。

blockSize

邻域尺寸(详见cornerEigenValsAndVecs )。

ksize

Sobel算子的滤镜参数。

borderType

边框模式,用于外推图像以外的像素,参见 BorderTypes。不支持BORDER_WRAP 。

  • void cv::cornerSubPix (InputArray image, InputOutputArray corners, 

Size winSize, Size zeroZone, TermCriteria criteria)

提炼角点位置。

这个函数迭代查找角点或径向鞍点的亚像素级精确位置,如下图所示。

 

亚像素精度角点定位是基于实际观察基础上的,如图,其中每一个落在邻域q内的从中心q到点p的矢量都正交于图像在p点的梯度,只受图像和噪声量的影响。考虑如下表达式:

                                 

此处 是在邻域q中pi点的图像梯度。q值是要查找的值,以使 ϵi 最小。设置ϵi0建立等式:

                         ​​​​​​​        

 其中梯度在邻域q(搜索窗口)内求和。令第一个梯度项为G,而第二个梯度项为b,则给出:

                                 

这个算法设置了邻域窗口的中心在新中心q,并且迭代直到中心驻留在一个设定的阈值内。

参数

image

输入单通道8位或浮点图像

corners

输入初始角点的坐标,输出为提炼过的坐标

winSize

搜索窗口的半边长。例如,如果winSize=Size(5,5),则搜索窗口是 (5∗2+1)×(5∗2+1)=11×11

zeroZone

搜索死区带的半尺寸参数,在这个区域上函数不做求和操作。这一般用于避免可能的自相关矩阵奇异点。(-1,-1) 表示没有这个尺寸。

criteria

角提炼过程的终止准则。即,角位置提炼过程在criteria.maxCount次数后迭代停止,或在某次迭代后角位置移动小于criteria.epsilon则停止。

  • Ptr<LineSegmentDetector> cv::createLineSegmentDetector (

                                        int _refine=LSD_REFINE_STD,

                                        double _scale=0.8,

                                        double _sigma_scale=0.6,

                                        double _quant=2.0,

                                        double _ang_th=22.5,

                                        double _log_eps=0,

                                        double _density_th=0.7,

                                        int _n_bins=1024)

建立指向LineSegmentDetector对象的指针并进行初始化。

LineSegmentDetector 算法使用标准值进行定义。只有高级使用者能够编辑并将其剪裁到自己的应用中。

参数

_refine

查找要提炼线段所使用的的方法,见LineSegmentDetectorModes

_scale

用于查找直线的图像比例。范围(0..1]。

_sigma_scale

高斯滤波的sigma值。sigma = _sigma_scale/_scale。

_quant

限定在梯度范数上的量化误差。

_ang_th

倾斜角度公差,度数单位。

_log_eps

检测阈值:-log10(NFA) > log_eps。仅用于高级细化选择。

_density_th

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值