Python OpenCV中HoughCircles代码的for循环逻辑解析求助
Hey,我来给你拆解这段霍夫圆检测代码里的for循环逻辑,一步步来:
首先先把代码整理成规范格式方便查看:
import cv2 import numpy as np img = cv2.imread('opencv_logo.png',0) img = cv2.medianBlur(img,5) cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20, param1=50,param2=30,minRadius=0,maxRadius=0) circles = np.uint16(np.around(circles)) for i in circles[0,:]: # draw the outer circle cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2) # draw the center of the circle cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) cv2.imshow('detected circles',cimg) cv2.waitKey(0) cv2.destroyAllWindows()
先搞懂circles变量的结构
cv2.HoughCircles函数返回的结果是一个3维NumPy数组,形状为(1, N, 3):
- 第一个维度是固定的1(可以理解为霍夫检测的批次维度)
- N是检测到的圆的总数
- 每个圆用3个数值描述:
[圆心x坐标, 圆心y坐标, 圆的半径]
而circles = np.uint16(np.around(circles))这一步,是把检测出的浮点数坐标/半径四舍五入后转成无符号16位整数——毕竟绘图时坐标得是整数才行。
核心的for循环逻辑
for i in circles[0,:]:
circles[0,:]是把3维数组“降维”成2维,变成形状为(N, 3)的数组,每一行对应一个圆的完整参数- 循环里的
i就是单个圆的参数列表:i[0]= 这个圆的圆心x坐标i[1]= 这个圆的圆心y坐标i[2]= 这个圆的半径
循环里的两个绘图操作
画圆的外圈:
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)- 第一个参数
cimg是我们要在上面绘图的彩色图像 (i[0],i[1])是圆心坐标i[2]是圆的半径(0,255,0)是BGR格式的绿色(OpenCV用BGR而非RGB)- 最后一个
2是线条的宽度
- 第一个参数
画圆心标记:
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)- 同样在
cimg上绘图,圆心还是(i[0],i[1]) - 这里的半径设为
2,是个很小的圆 (0,0,255)是BGR格式的红色- 最后一个
3是线条宽度,因为半径只有2,这个宽度会直接把小圆填满,变成一个实心的红色点,用来清晰标记圆心
- 同样在
简单说,这个for循环就是遍历所有检测到的圆,给每个圆都画上绿色外圈和红色圆心,让我们能直观看到霍夫圆检测的结果~
内容的提问来源于stack exchange,提问作者Lleims
相关产品推荐
相关产品推荐

