我正在看一个OpenCV教程,他在一个地方写了这样的代码:
while True:
success, img = cap.read()
cv2.imshow("Video", img)
if (cv2.waitKey(1) & 0xFF ==ord('q')):
break我对第二行感到困惑。根据画外音,它将读取的图像存储在img中,并将一个布尔值保存到success中,记录我们是否能够读取图像。这事儿可以理解。我只是不知道success的用途,但是如果我删除它,第3行就会出现错误。
根据imshow()方法,它只接受窗口名称的字符串,然后是img (我们上面有)。所以我不确定为什么需要success。
(除了import语句之外,屏幕上没有其他代码)
发布于 2021-01-02 12:15:34
cap.read()返回的是布尔值(真/假)和图像内容。如果删除success,img变量会将该布尔值和图像数据作为元组。这就是为什么你会得到一个错误。
OpenCV中的.read()返回两件事:布尔值和数据。如果没有2个变量,则会将一个元组分配给一个变量。布尔值主要用于捕获错误。将一个元组分配给具有2个数据项的1个var有时会很有用,但在这种情况下,您应该创建2个var并将数据拆分为2个变量,以使其更容易。
如果不想将bool赋值给变量,可以使用_作为变量名。
发布于 2021-01-02 16:03:54
cap.read()返回一个元组,其中包含一个布尔值成功标志和视频帧。
如果视频已经结束,则成功标志为False。在这种情况下,框架是空的。
您必须测试该标志并结束循环。
您观看的教程未能做到这一点。它教会你错了。
此外,您必须检查cap.isOpened(),因为打开视频文件(或摄像头)可能会失败,您需要对此做出反应。
下面是正确的代码:
cap = cv2.VideoCapture(...) # open a video file or camera
assert cap.isOpened(), "file/camera could not be opened!"
while True:
(success, img) = cap.read() # cap.read() always returns a tuple of two things
if not success: break # you absolutely must check this
cv2.imshow("Video", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break发布于 2021-01-02 12:24:47
有关视频采集的阅读,请参考OpenCV文档。它返回被捕获的状态和图像。"success“不是必须的,但推荐使用。它会告诉您是否已成功捕获图像。在您的示例中,如果您在第三行遇到错误,您可以执行img = cap.read()1,然后它应该可以工作。但是,不建议这样做,因为可能由于捕获任何图像失败而返回none。
https://stackoverflow.com/questions/65535939
复制相似问题