circles
是 cv2.HoughCircles
函数返回的数组,它包含了检测到的圆形的信息。每个圆形由圆心的坐标 (x, y)
和半径 r
组成,格式为 (x, y, r)
。这些值最初是以浮点数形式给出的。
circles = cv2.HoughCircles(gray, cv2.HoughCircles.HOUGH_GRADIENT, 1, 20, param1=50, param2=80, minRadius=0, maxRadius=0)
返回的 circles
数组的数据类型通常是 float32
,因为霍夫变换可能会输出浮点数坐标和半径。然而,在实际应用中,特别是在图像上绘制圆形时,我们需要整数类型的坐标。
np.uint16(np.around(circles))
的作用:
np.around(circles)
:这个numpy
函数将circles
数组中的每个浮点数四舍五入到最接近的整数。由于图像的坐标是从 0 开始的整数,我们需要将这些浮点数坐标转换为整数。np.uint16()
:这个numpy
函数将np.around
函数的结果转换为 16 位无符号整数。选择uint16
是因为它能够覆盖图像坐标的合理范围(0 到 65535),这通常足以处理大多数图像尺寸。
为什么要用:
- 坐标类型:图像处理函数,如
cv2.circle
,要求坐标是整数类型。 - 避免精度问题:浮点数坐标可能会导致绘制函数无法正确渲染图形。
- 性能:整数运算通常比浮点数运算更快,尤其是在图形渲染中。
代码解释:
circles = np.uint16(np.around(circles))
这行代码的作用是确保 circles
数组中的圆形坐标和半径是整数类型,这样就可以在图像上准确地绘制圆形。
绘制圆形:
for i in circles[0, :]:
cv2.circle(src, (i[0], i[1]), i[2], (0, 0, 255), 2)