圆的参数方程为:
r
2
=
(
x
?
x
0
)
2
+
(
y
?
y
0
)
2
r^2=(x-x_0)^2+(y-y_0)^2
r2=(x?x0?)2+(y?y0?)2 这个方程包含三个参数(圆半径和圆心坐标),这表明需要使用三维的累加器。但一般来说,累加器的维数越多,霍夫变换就越复杂,可靠性也越低。在本例中,每个像素点都会使累加器增加大量的入口。因此,精确地定位局部尖峰值会变得更加困难。为解决这个问题,人们提出了各种策略。OpenCV 采用的策略是在用霍夫变换检测圆的实现中使用两轮筛选。第一轮筛选使用一个二维累加器,找出可能是圆的位置。因为圆周上像素点的梯度方向与半径的方向是一致的,所以对每个像素点来说,累加器只对沿着梯度方向的入口增加计数(根据预先定义的最小和最大半径值)。一旦检测到可能的圆心(即收到了预定数量的投票),就在第二轮筛选中建立半径值范围的一维直方图。这个直方图的尖峰值就是被检测圆的半径。 实现上述策略的 cv::HoughCircles 函数将 Canny 检测与霍夫变换结合,它的调用方法是:
cv::GaussianBlur(image,image,cv::Size(5,5),1.5);
std::vector<cv::Vec3f> circles;
cv::HoughCircles(image, circles, cv::HOUGH_GRADIENT,
2,
50,
200,
100,
25,
100);
有一点需要反复提醒:在调用 cv::HoughCircles 函数之前,要对图像进行平滑化,以减少图像中可能导致误判的噪声。检测的结果存放在 cv::Vec3f 实例的向量中。前面两个数值是圆心坐标,第三个数值是半径。
|