OpenCV图像采集断言失败:首帧成功后续帧捕获失败求助
问题分析与解决:OpenCV采集图像时后续帧捕获失败
问题根源
你代码里的核心错误是把cap.release()放在了内层的图像采集循环里。第一次采集完图像后,摄像头就被释放了,后续的cap.read()自然无法获取到帧,返回ret=False,此时frame为空,调用cv2.imwrite()就会触发!_img.empty()的断言错误。
修复后的代码
把cap.release()和cv2.destroyAllWindows()移到内层循环结束之后,确保整个标签的图像采集完成后再释放摄像头,同时增加帧获取成功的判断逻辑:
import cv2 import uuid import os import time imagesPath = "Tensorflow/workspace/images/collectedimages" if not os.path.exists(imagesPath): os.makedirs(imagesPath) labels = ['hello', 'thankyou', 'yes', 'no', 'iloveyou'] numberImages = 20 for label in labels: labelPath = os.path.join(imagesPath, label) if not os.path.exists(labelPath): os.makedirs(labelPath) cap = cv2.VideoCapture(0) print("Collecting images for {}".format(label)) for num in range(numberImages): ret, frame = cap.read() print("ret:", ret) # 先判断是否成功获取帧,避免空帧触发错误 if not ret: print("Failed to capture frame, skipping...") continue imageName = os.path.join(imagesPath, label, label + "." + "{}.jpg".format(str(uuid.uuid1()))) print("imageName:", imageName) cv2.imwrite(imageName, frame) cv2.imshow('captureImages', frame) time.sleep(2) if cv2.waitKey(1) & 0xFF == ord('q'): break # 内层循环结束后再释放摄像头并关闭窗口 cap.release() cv2.destroyAllWindows()
额外说明
- 新增的
ret判断逻辑可以在摄像头临时故障时跳过错误帧,避免程序直接崩溃 cv2.destroyAllWindows()用于关闭显示窗口,防止程序结束后残留未关闭的窗口
内容的提问来源于stack exchange,提问作者Spikes
相关产品推荐
相关产品推荐

