Opencv学习---霍夫变换检测圆的基本原理

为了方便以后查看,将基本笔记收藏到这里!

原博文:http://blog.csdn.net/yizhaoyanbo/article/details/59172991    


其实检测圆形和检测直线的原理差别不大,只不过直线是在二维空间,因为y=kx+b,只有k和b两个自由度。而圆形的一般性方程表示为(x-a)²+(y-b)²=r²。那么就有三个自由度圆心坐标a,b,和半径r。这就意味着需要更多的计算量,而OpenCV中提供的cvHoughCircle()函数里面可以设定半径r的取值范围,相当于有一个先验设定,在每一个r来说,在二维空间内寻找a和b就可以了,能够减少计算量。


具体步骤如下:

1.对输入图像进行边缘检测,获取边界点,即前景点。

2.假如图像中存在圆形,那么其轮廓必定属于前景点(此时请忽略边缘提取的准确性)。

3.同霍夫变换检测直线一样,将圆形的一般性方程换一种方式表示,进行坐标变换。由x-y坐标系转换到a-b坐标系。写成如下形式(a-x)²+(b-y)²=r²。那么x-y坐标系中圆形边界上的一点对应到a-b坐标系中即为一个圆。

4.那x-y坐标系中一个圆形边界上有很多个点,对应到a-b坐标系中就会有很多个圆。由于原图像中这些点都在同一个圆形上,那么转换后a,b必定也满足a-b坐标系下的所有圆形的方程式。直观表现为这许多点对应的圆都会相交于一个点,那么这个交点就可能是圆心(a, b)。

5.统计局部交点处圆的个数,取每一个局部最大值,就可以获得原图像中对应的圆形的圆心坐标(a,b)。一旦在某一个r下面检测到圆,那么r的值也就随之确定。


以下面的图片为例,调用OpenCV中的cvHoughCircles()进行圆形的检测,左边为原图,右边为检测结果,圆形都被圈出。

                               

代码:

#include"cv.h"
#include"highgui.h"
#include<math.h>
using namespace cv;

void main()
{
	IplImage* srcImg=cvLoadImage("img.jpg", CV_LOAD_IMAGE_GRAYSCALE);

	CvMemStorage* storage= cvCreateMemStorage(0);
	cvSmooth(srcImg, srcImg, CV_GAUSSIAN, 5, 5);
	
	//函数范围值为指向图像序列的指针
	CvSeq* results=cvHoughCircles(srcImg, storage, CV_HOUGH_GRADIENT, 2,srcImg->width/10);

	for (int i=0; i<results->total; i++)
	{
		float* p=(float*) cvGetSeqElem(results, i);  //依次获取图像序列中的图像数据
		CvPoint pt=cvPoint(cvRound(p[0]), cvRound(p[1]));  //获取圆心坐标
		cvCircle(srcImg, pt, cvRound(p[2]), CV_RGB(0xff, 0xff, 0xff), 3, 8);  //在图片中将圆形画出来
	}

	cvNamedWindow("Img", 1);
	cvShowImage("Img", srcImg);

	cvWaitKey(-1);

	cvReleaseImage(&srcImg);
	cvDestroyAllWindows();
}


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
霍夫检测是一种用于检测图像中形的算法。在OpenCV中,霍夫检测是基于图像梯度的实现。具体原理如下: 1. 首先,对图像进行中值滤波,以减少噪声的影响\[1\]。 2. 接下来,通过检测边缘来发现可能的心。这一步使用图像梯度的方法来计算边缘\[1\]。 3. 在第一步的基础上,从候选心开始计算最佳半径大小。这一步使用霍夫变换的方法来确定的半径\[1\]。 在OpenCV中,可以使用cv::HoughCircles函数来实现霍夫检测。该函数的参数包括输入图像、输出结果、方法、尺度因子、最短距离、Canny边缘检测的低阈值、中心点累加器阈值、最小半径和最大半径\[3\]。 总结来说,霍夫检测通过对图像进行中值滤波和边缘检测,然后使用霍夫变换来确定的位置和半径。这种方法可以有效地检测图像中的形物体。 #### 引用[.reference_title] - *1* [OpenCvSharp 学习笔记21-- 霍夫变换 - 检测 (Hough Circle transform)](https://blog.csdn.net/weixin_41049188/article/details/92422241)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [OpenCV 霍夫检测](https://blog.csdn.net/qq_44989881/article/details/116135750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [OpenCV20---霍夫检测](https://blog.csdn.net/qq_45646174/article/details/105086711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值