特征检测是检测图像中的特征信息,比如边缘,线段,角点位置等。在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算法查找输入图像的边缘并在输出图像中标记这些边缘图。threshold1和threshold2之间的最小值用于边缘的连接。最大值用于查找强边缘的起始线段。
参数
| image |
8-位输入图像 |
| edges |
输出的边缘图,单通道8位图像,与源图同尺寸 |
| threshold1 |
迟滞过程的第一个阈值 |
| threshold2 |
迟滞过程的第二个阈值 |
| apertureSize |
Sobel算子的滤镜尺寸 |
| L2gradient |
标志,表示是用更精确的L2 norm = |
- 、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 。 |
参见
cornerMinEigenVal, cornerHarris, preCornerDetect
- 、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 最小。设置ϵi为0建立等式:
![]()
其中梯度在邻域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 |

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

被折叠的 条评论
为什么被折叠?



