本文将进入方案设计的核心部分,我们在实现方案的过程中,仪表盘和指针的定位信息十分重要,因为我们需要指针的偏转角来进行参数计算,而仪表盘的圆心和弧度会在进行直线选择的过程中提供非常重要的阈值,对结果的正确性至关重要。
方案选择
在圆检测的方案中,主要考虑了两种方案:
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下载学习,请关注作者,共同学习交流。