前言
Opencv学习-学习笔记4
感觉不怎么会用这个霍夫变换寻找直线和圆,最后都没用上。效果不好。
cvHoughLines2()函数寻找直线
利用Hough变换在二值图像中寻找直线。
对于opencv的霍夫变换讲解:教程
函数详解
CvSeq* cvHonghLines2(CvArr* image,void* line_storage,int mehtod,double rho, double theta,int threshold,double param1 =0,double param2 =0);
参数说明:image
输入8-比特、单通道(二值)图像,当用CV_HOUGH_PROBABILISTIC方法检测的时候其内容会被函数改变。line_storage
检测到的线段存储仓.可以是内存存储仓(此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的线段。如果 line_storage 是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(线段没有按照长度、可信度或其它指标排序).method
Hough 变换变量,是下面变量的其中之一:
- CV_HOUGH_STANDARD - 传统或标准 Hough 变换. 每一个线段由两个浮点数 (ρ, θ) 表示,其中 ρ 是直线与原点(0,0) 之间的距离,θ 线段与 x-轴之间的夹角。因此,矩阵类型必须是 CV_32FC2 type.
- CV_HOUGH_PROBABILISTIC- 概率 Hough 变换(如果图像包含一些长的线性分割,则效率更高). 它返回线段分割而不是整个线段。每个分割用起点和终点来表示,所以矩阵(或创建的序列)类型是 CV_32SC4.
- CV_HOUGH_MULTI_SCALE - 传统 Hough 变换的多尺度变种。线段的编码方式与 CV_HOUGH_STANDARD 的一致.
rho
以像素为单位的距离精度,一般取1theta
以弧度为单位角度精度,一般取CV_PI/180threshold
阈值参数。当在一条直线上的像素点数大于threshold时,才将该直线作为检测结果显示出来。该值越大,得到直线越少。param1
对传统 Hough 变换,不使用(0).
对概率Hough变换,它是最小线段长度.即当线段长度大于param1时,才将该线段作为检测结果显示。与上一参数类似,不过上一参数为像素数,而该参数为线段长度。
对多尺度 Hough 变换,它是距离精度 rho 的分母 (大致的距离精度是 rho 而精确的应该是 rho / param1 ).param2
对传统 Hough 变换,不使用 (0).
对概率 Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一条长直线。
对多尺度 Hough 变换,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精确的角度应该是 theta / param2).
在4检测直线.cpp
中使用例子
1 | lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 ); |
该函数的返回值保存在一个CvSeq内.
霍夫圆变换HoughCircles
教程网址
函数定义CvSeq* cvHoughCircles( CvArr* image, void* circle_storage, int method, double dp, double min_dist, double param1=100, double param2=100, int min_radius=0, int max_radius=0 );
参数说明:image
输入 8-比特、单通道灰度图像.circle_storage
检测到的圆存储仓. 可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的CV_32FC3型矩阵(CvMat*). 矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的圆。如果 circle_storage 是矩阵,而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回. 每个圆由三个浮点数表示:圆心坐标(x,y)和半径.method
Hough 变换方式,目前只支持CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].dp
累加器图像的分辨率。这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。
Resolution of the accumulator used to detect centers of the circles. For example, if it is 1, the accumulator will have the same resolution as the input image, if it is 2 - accumulator will have twice smaller width and height, etc.min_dist
该参数是让算法能明显区分的两个不同圆之间的最小距离。
Minimum distance between centers of the detected circles. If the parameter is too small, multiple neighbor circles may be falsely detected in addition to a true one. If it is too large, some circles may be missed.param1
用于Canny的边缘阀值上限,下限被置为上限的一半。
The first method-specific parameter. In case of CV_HOUGH_GRADIENT it is the higher threshold of the two passed to Canny edge detector (the lower one will be twice smaller).param2
累加器的阀值。
The second method-specific parameter. In case of CV_HOUGH_GRADIENT it is accumulator threshold at the center detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first.min_radius
最小圆半径。
Minimal radius of the circles to search for.max_radius
最大圆半径。
Maximal radius of the circles to search for. By default the maximal radius is set to max(image_width, image_height).