为什么在Python函数内调用cv2.HoughCircles会触发OpenCV断言错误?
报错成因与修复方法
成因
- 核心触发原因是
cv2.HoughCircles接口的输入格式要求:根据报错中的断言规则_image.type() == CV_8UC1,该函数只能接收单通道8位灰度图像作为输入。你代码中cv2.imread默认读取的是3通道BGR彩色图像,直接传入后触发类型校验失败。 - 同时你的代码存在两处隐藏逻辑漏洞:
- 未对
circles is None的情况做完整拦截,如果没有检测到符合条件的圆形,后续遍历circles的代码会直接报错 HoughCircles返回的检测结果是结构为(1, N, 3)的三维数组,直接遍历circles会因维度不匹配报错
- 未对
修复步骤
- 调用
HoughCircles前先将输入的彩色图像转换为灰度图 - 调整非空判断的范围,将绘制圆形的逻辑也放入非空判断分支内
- 修正circles的遍历逻辑,取第一层元素后再遍历每个圆形参数
修复后完整代码
import cv2 import numpy as np def test(image): # 先转灰度图,符合HoughCircles输入要求 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 4, 70, minRadius=70, maxRadius=74) if circles is not None: circles = np.uint16(np.around(circles)) # 取三维数组的第一层遍历 for x, y, r in circles[0,:]: cv2.circle(image, (x, y), r, [0, 0, 255], 2) return image img = cv2.imread('initial_frame.png') image2 = test(img) cv2.imshow('test', image2) cv2.waitKey(0) cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者python noob
相关产品推荐
相关产品推荐

