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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:55:18