OpenCV findContours函数二进制输入仍报格式不支持错误排查
问题原因与解决方法
核心错误
你代码里的cv.cvtColor(img[1], cv.IMREAD_GRAYSCALE)用错了参数:cv.IMREAD_GRAYSCALE是用于cv.imread()读取灰度图的标识,不是cv.cvtColor的颜色转换参数。这个错误会导致生成的prepared_frame并非标准的8位单通道灰度图(CV_8UC1),后续即使做了阈值处理,图像格式依然不满足cv.findContours的要求,从而触发报错。
修复步骤
- 修正颜色转换参数:把
cv.IMREAD_GRAYSCALE替换为cv.COLOR_BGR2GRAY,这才是将BGR格式帧转为灰度图的正确标识。 - 增加帧读取有效性检查:
cap.read()返回的第一个值ret表示是否成功读取帧,需要先判断ret为True再处理,避免读到空帧引发异常。 - 适配OpenCV4的返回值:OpenCV4中
cv.findContours返回两个值(轮廓列表、层级信息),建议显式接收这两个返回值。
修正后的核心代码
filename = os.fsdecode(file) frame_count = 0 previous_frame = None ipath = data + "/" + filename cap = cv.VideoCapture(ipath) while True: ret, frame = cap.read() # 检查是否成功读取帧 if not ret: break frame_count += 1 # 修正颜色转换参数 prepared_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) prepared_frame = cv.GaussianBlur(src=prepared_frame, ksize=(5,5), sigmaX=0) if frame_count == 1: previous_frame = prepared_frame continue diff_frame = cv.absdiff(src1=previous_frame, src2=prepared_frame) previous_frame = prepared_frame kernel = np.ones((5, 5)) diff_frame = cv.dilate(diff_frame, kernel, 1) thresh_frame = cv.threshold(src=diff_frame, thresh=20, maxval=255, type=cv.THRESH_BINARY)[1] # 适配OpenCV4的返回值 contours, hierarchy = cv.findContours(image=thresh_frame, mode=cv.RETR_EXTERNAL, method=cv.CHAIN_APPROX_SIMPLE)
内容的提问来源于stack exchange,提问作者Bristle
相关产品推荐
相关产品推荐

