OpenCVAssert失败

myss37ts  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(96)

我试图尝试收集图像使用开放的简历,但问题是,它给了我Assert失败,其中它未能捕捉帧。第一帧捕获成功,但后续帧捕获失败。
我的代码:

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)
        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()

字符串
下面是输出和错误:

Collecting images for hello
ret: True
imageName: Tensorflow/workspace/images/collectedimages\hello\hello.701b06f0-24a3-11ee-8d31-0068eb8c6ae0.jpg
ret: False
imageName: Tensorflow/workspace/images/collectedimages\hello\hello.717b980e-24a3-11ee-87ef-0068eb8c6ae0.jpg
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
Cell In[9], line 14
     12 imageName = os.path.join(imagesPath, label, label + "." + "{}.jpg".format(str(uuid.uuid1())))
     13 print("imageName:", imageName)
---> 14 cv2.imwrite(imageName,frame)
     15 cv2.imshow('captureImages',frame)
     16 time.sleep(2)

error: OpenCV(4.6.0) C:\b\abs_d8ltn27ay8\croot\opencv-suite_1676452046667\work\modules\imgcodecs\src\loadsave.cpp:801: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'


回答并找到解决我问题的方法

yqyhoc1h

yqyhoc1h1#

你把cap.release()放在for循环中,在你读到第一张图片后,capstream就不存在了。因此,当你读取它时,你会得到一个ret=False,你不能从中获得一个帧。

eyh26e7m

eyh26e7m2#

从您给出的输出来看,它显示ret: False。这清楚地表明那里没有图像。您所做的是,一旦第一次迭代完成,您就释放了对象(cap.release())。以后,您就不会再重新创建该对象了。您需要将其转移到条件检查。

if cv2.waitKey(1) & 0xFF == ord('q'):
    cap.release()
    break

字符串
这样,只有当你按下“q”时,对象才会被释放。希望这能澄清一切。

相关问题