Python:理解OpenCV中的read()



我正在观看OpenCV教程,他在一个地方写下了以下代码:

while True:
success, img = cap.read() 
cv2.imshow("Video", img)
if (cv2.waitKey(1) & 0xFF ==ord('q')):
break

我对第二行感到困惑。根据画外音,它将读取的图像存储在img中,并将布尔值保存到success,记录我们是否能够读取图像。这是有道理的。我只是不知道success的用途是什么,但如果我删除它,第3行就会出现错误。

根据imshow()方法,它只接受一个String作为窗口名称,然后是img(我们上面有(。所以我不确定为什么需要success

(进口对账单之外的屏幕上没有其他代码(

cap.read()返回的是布尔值(True/False(和图像内容。如果删除success,则img变量将布尔值和图像数据作为元组。这就是您出现错误的原因。

OpenCV中的.read()返回两个东西,布尔值和数据。如果没有2个变量,则一个元组将被分配给一个变量。布尔值主要用于错误捕获。将元组分配给具有2个数据项的1个变量有时可能很有用,但在这种情况下,您应该创建2个变量,并将数据拆分为2个变量以使其更容易。

如果不想将bool分配给var,可以使用_作为变量名。

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

请参阅OpenCV关于视频捕获的文档。它返回正在捕获的状态和图像。";成功;不是必需的,但建议使用。它告诉你是否成功地拍摄了一张照片。在您的情况下,如果在第三行出现错误,您可以执行img=cap.read(([1],那么它应该可以工作。但是,不建议这样做,因为由于无法捕获任何图像,可能会返回"无"。

最新更新