使用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
相关产品推荐
相关产品推荐

