OpenCV 指针仪表盘参数读取(三) 圆检测

本文将进入方案设计的核心部分,我们在实现方案的过程中,仪表盘和指针的定位信息十分重要,因为我们需要指针的偏转角来进行参数计算,而仪表盘的圆心和弧度会在进行直线选择的过程中提供非常重要的阈值,对结果的正确性至关重要。

方案选择

在圆检测的方案中,主要考虑了两种方案:

1.Hough圆检测算法

2.随机采样圆检测算法

其中Hough圆检测算法是普及程度较高的算法,在OpenCV的库中也有相应的封装函数HoughCircles,于是基本确立了程序的书写思路,定义一个变量接受由HoughCircles函数接收到的所有圆

vector<Vec3f> circles

HoughCircles函数使用过程需要根据情况调节最小半径和最大半径,来取得最好的圆检测信息,由于HoughCircles的原理是检测图中所有的可能性的圆信息,因此相比于随机采样的圆检测算法效率更低,且对于圆残缺的情况鲁棒性有限,其优势是实现简单,且应用广泛,具有很好的情景兼容情况,代码如下:

HoughCircles(gray_img, circles, HOUGH_GRADIENT, 1,
        // change this value to detect circles with different distances to each other
        gray_img.rows / 16, 100, 30, 127, 138	     
        // change the last two parameters
        // (min_radius & max_radius) to detect larger circles
	);

接下来是对圆区域的绘制工作,主要使用circle函数,这是需要注意的是circle中的颜色调节函数Scalar采用的是B G R的顺序,在使用过程可以稍微注意一下:

for (size_t i = 0; i < circles.size(); i++)
	{
		Vec3i c = circles[i];
		circle_center = Point(c[0], c[1]);
		// circle center
		// Scalar B G R
		circle(midd_img, circle_center, 1, Scalar(0, 0, 255), 3, LINE_AA);
		// circle outline
		circle_radius = c[2];
		circle(midd_img, circle_center, circle_radius, Scalar(255, 255, 0), 3, LINE_AA);

		// cout << circle_center.x << " " <<circle_center.y << " " << circle_radius << endl;
	}

效果图如下:

欢迎评论文章,给予宝贵建议,工程提供在github下载学习,请关注作者,共同学习交流。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值