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

使用OpenCV2的HoughCircles检测圆时遇AttributeError错误求助

解决OpenCV HoughCircles检测后np.around报错的问题

看起来你踩了HoughCircles函数的一个常见坑——当函数没有检测到任何圆时,会返回None,而不是空数组。你直接对None调用np.around,自然会抛出AttributeError,因为NoneType根本没有round或者rint这些方法。

另外你的代码还有个小笔误:第二步写的是np.around(ch),但第一步的检测结果存在chh变量里,应该是np.around(chh)才对,不过核心问题还是返回值为None的情况没处理。

错误原因拆解

从错误栈里的关键信息就能明确问题:

AttributeError: 'NoneType' object has no attribute 'round'

这说明cv2.HoughCircles(crr, ...)这一步没有检测到符合条件的圆,返回了None。后续你直接把这个None传给np.around,就触发了报错。

解决方案

处理思路很简单:先判断检测结果是否为None,只有检测到圆的时候再进行数组转换和后续操作;同时检查HoughCircles的参数是否适配你的图像。

修改后的代码示例:

# 执行圆检测
chh = cv2.HoughCircles(
    crr, 
    cv2.HOUGH_GRADIENT, 
    1, 
    minDist=50, 
    param1=200, 
    param2=18, 
    minRadius=20, 
    maxRadius=60
)

# 先判断是否成功检测到圆
if chh is not None:
    # 将检测结果转换为整数数组
    ch = np.uint16(np.around(chh))
    # 这里可以添加绘制圆或者其他处理逻辑
    for circle in ch[0, :]:
        # 绘制圆心
        cv2.circle(your_image, (circle[0], circle[1]), 2, (0, 255, 0), 3)
        # 绘制圆的轮廓
        cv2.circle(your_image, (circle[0], circle[1]), circle[2], (0, 0, 255), 2)
else:
    print("没有检测到任何圆,请调整参数或检查输入图像")

参数调整建议

如果还是检测不到圆,大概率是参数设置不合适,可以参考这些方向微调:

  • param1:这是Canny边缘检测的高阈值,低阈值会自动设为它的一半。值太高会过滤掉有效边缘,太低则会引入大量噪声,可尝试在100-300区间调整。
  • param2:累加器阈值,值越低越容易检测到假圆,值越高只有最明显的圆会被保留,可尝试在10-50区间调整。
  • minDist:两个圆心之间的最小距离,圆靠得近就调小,有大量重叠假圆就调大。
  • minRadius/maxRadius:确保目标圆半径在这个范围内,如果不确定,先把这两个值设为0(自动检测),找到合适范围后再固定。

内容的提问来源于stack exchange,提问作者quadhd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:18:11