You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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] = 这个圆的半径

循环里的两个绘图操作

  1. 画圆的外圈:
    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是线条的宽度
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:41:07