没有合适的资源?快使用搜索试试~ 我知道了~
Opencv2.4.9源码分析——HoughCircles.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 180 浏览量
2022-06-18
01:26:49
上传
评论
收藏 402KB PDF 举报
温馨提示
试读
13页
Opencv2.4.9源码分析——HoughCircles.pdfOpencv2.4.9源码分析——HoughCircles.pdfOpencv2.4.9源码分析——HoughCircles.pdfOpencv2.4.9源码分析——HoughCircles.pdfOpencv2.4.9源码分析——HoughCircles.pdfOpencv2.4.9源码分析——HoughCircles.pdfOpencv2.4.9源码分析——HoughCircles.pdfOpencv2.4.9源码分析——HoughCircles.pdf
资源推荐
资源详情
资源评论
Opencv2.4.9 源码分析——HoughCircles
图形可以用一些参数进行表示,标准霍夫变换的原理就是把图像空间转换成参数空间(即霍
夫空间),例如霍夫变换的直线检测就是在距离-角度空间内进行检测。圆可以表示成:
(x-a)2+(y-b)2=r2 (1)
其中 a 和 b 表示圆心坐标,r 表示圆半径,因此霍夫变换的圆检测就是在这三个参数组成的
三维空间内进行检测。
原则上,霍夫变换可以检测任何形状。但复杂的形状需要的参数就多,霍夫空间的维数就多,
因此在程序实现上所需的内存空间以及运行效率上都不利于把标准霍夫变换应用于实际复
杂图形的检测中。所以一些改进的霍夫变换就相继提出,它们的基本原理就是尽可能减小霍
夫空间的维数。
HoughCircles 函数实现了圆形检测,它使用的算法也是改进的霍夫变换—— 2-1 霍夫变换
(21HT)。也就是把霍夫变换分为两个阶段,从而减小了霍夫空间的维数。第一阶段用于检
测圆心,第二阶段从圆心推导出圆半径。检测圆心的原理是圆心是它所在圆周所有法线的交
汇处,因此只要找到这个交点,即可确定圆心,该方法所用的霍夫空间与图像空间的性质相
同,因此它仅仅是二维空间。检测圆半径的方法是从圆心到圆周上的任意一点的距离(即半
径)是相同,只要确定一个阈值,只要相同距离的数量大于该阈值,我们就认为该距离就是
该圆心所对应的圆半径,该方法只需要计算半径直方图,不使用霍夫空间。圆心和圆半径都
得到了,那么通过公式 1 一个圆形就得到了。从上面的分析可以看出,2-1 霍夫变换把标准
霍夫变换的三维霍夫空间缩小为二维霍夫空间,因此无论在内存的使用上还是在运行效率
上,2-1 霍夫变换都远远优于标准霍夫变换。但该算法有一个不足之处就是由于圆半径的检
测完全取决于圆心的检测,因此如果圆心检测出现偏差,那么圆半径的检测肯定也是错误的。
2-1 霍夫变换的具体步骤为:
第一阶段:检测圆心
1.1、对输入图像边缘检测;
1.2、计算图形的梯度,并确定圆周线,其中圆周的梯度就是它的法线;
1.3、在二维霍夫空间内,绘出所有图形的梯度直线,某坐标点上累加和的值越大,说明在
该点上直线相交的次数越多,也就是越有可能是圆心;
1.4、在霍夫空间的 4 邻域内进行非最大值抑制;
1.5、设定一个阈值,霍夫空间内累加和大于该阈值的点就对应于圆心。
第二阶段:检测圆半径
2.1、计算某一个圆心到所有圆周线的距离,这些距离中就有该圆心所对应的圆的半径的值,
这些半径值当然是相等的,并且这些圆半径的数量要远远大于其他距离值相等的数量;
2.2、设定两个阈值,定义为最大半径和最小半径,保留距离在这两个半径之间的值,这意
味着我们检测的圆不能太大,也不能太小;
2.3、对保留下来的距离进行排序;
2.4、找到距离相同的那些值,并计算相同值的数量;
2.5、设定一个阈值,只有相同值的数量大于该阈值,才认为该值是该圆心对应的圆半径;
2.6、对每一个圆心,完成上面的 2.1~2.5 步骤,得到所有的圆半径。
HoughCircles 函数的原型为:
void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist,
double param1=100, double param2=100, int minRadius=0,int maxRadius=0 )
image 为输入图像,要求是灰度图像
circles 为输出圆向量,每个向量包括三个浮点型的元素——圆心横坐标,圆心纵坐标和圆半
径
method 为使用霍夫变换圆检测的算法,Opencv2.4.9 只实现了 2-1 霍夫变换,它的参数是
CV_HOUGH_GRADIENT
dp 为第一阶段所使用的霍夫空间的分辨率,dp=1 时表示霍夫空间与输入图像空间的大小一
致,dp=2 时霍夫空间是输入图像空间的一半,以此类推
minDist 为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是
同一个圆心
param1 为边缘检测时使用 Canny 算子的高阈值
param2 为步骤 1.5 和步骤 2.5 中所共有的阈值
minRadius 和 maxRadius 为所检测到的圆半径的最小值和最大值
HoughCircles 函数在 sources/modules/imgproc/src/hough.cpp 文件内被定义:
[cpp] view plain copy
void cv::HoughCircles( InputArray _image, OutputArray _circles,
int method, double dp, double min_dist,
double param1, double param2,
int minRadius, int maxRadius )
{
//定义一段内存
Ptr<CvMemStorage> storage = cvCreateMemStorage(STORAGE_SIZE);
Mat image = _image.getMat(); //提取输入图像矩阵
CvMat c_image = image; //矩阵转换
//调用 cvHoughCircles 函数
CvSeq* seq = cvHoughCircles( &c_image, storage, method,
dp, min_dist, param1, param2, minRadius, maxRadius );
//把序列转换为矩阵
seqToMat(seq, _circles);
}
cvHoughCircles 函数为:
[cpp] view plain copy
CV_IMPL CvSeq*
cvHoughCircles( CvArr* src_image, void* circle_storage,
int method, double dp, double min_dist,
double param1, double param2,
int min_radius, int max_radius )
{
CvSeq* result = 0;
CvMat stub, *img = (CvMat*)src_image;
CvMat* mat = 0;
CvSeq* circles = 0;
CvSeq circles_header;
CvSeqBlock circles_block;
int circles_max = INT_MAX; //输出最多圆形的数量,设为无穷多
//canny 边缘检测中双阈值中的高阈值
int canny_threshold = cvRound(param1);
//累加器阈值
int acc_threshold = cvRound(param2);
img = cvGetMat( img, &stub );
//确保输入图像是灰度图像
if( !CV_IS_MASK_ARR(img))
CV_Error( CV_StsBadArg, "The source image must be 8-bit, single-channel" );
//内存空间是否存在
if( !circle_storage )
CV_Error( CV_StsNullPtr, "NULL destination" );
//确保参数的正确性
if( dp <= 0 || min_dist <= 0 || canny_threshold <= 0 || acc_threshold <= 0 )
CV_Error( CV_StsOutOfRange, "dp, min_dist, canny_threshold and acc_threshold must
be all positive numbers" );
剩余12页未读,继续阅读
资源评论
- 达4482023-07-20资源不错,对我启发很大,获得了新的灵感,受益匪浅。
- SFY1711_2023-02-26非常有用的资源,可以直接使用,对我很有用,果断支持!
- m0_729442052022-08-24资源值得借鉴的内容很多,那就浅学一下吧,值得下载!
春哥111
- 粉丝: 1w+
- 资源: 5万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功