我试图尝试收集图像使用开放的简历,但问题是,它给了我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'
型
回答并找到解决我问题的方法
2条答案
按热度按时间yqyhoc1h1#
你把
cap.release()
放在for循环中,在你读到第一张图片后,capstream就不存在了。因此,当你读取它时,你会得到一个ret=False
,你不能从中获得一个帧。eyh26e7m2#
从您给出的输出来看,它显示
ret: False
。这清楚地表明那里没有图像。您所做的是,一旦第一次迭代完成,您就释放了对象(cap.release()
)。以后,您就不会再重新创建该对象了。您需要将其转移到条件检查。字符串
这样,只有当你按下“q”时,对象才会被释放。希望这能澄清一切。