我最近在Windows上使用Python 3.5.4下载了openCV 3.4.5。
我运行了这段基本代码来显示视频:
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
print(frame)
# Display the resulting frame
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
从笔记本电脑的网络摄像头中显示了一个视频。
请注意,我从视频中打印出每一帧,但是在控制台输出中,每个numpy数组都填充有零。我不明白为什么会这样,因为视频正在播放
控制台输出示例
[[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
...
答案 0 :(得分:3)
从Opencv docs,read
的{{1}}方法返回VideoCapture
的元组。如果成功读取了(ret, frame)
,则frame
将是True
,否则将是frame
。因此,为了使您在运行代码时弄清楚发生了什么,请执行以下操作:
False
循环中的print语句更改为while
,然后再次运行代码
print(ret)
的值大部分或全部是ret
,则通常每个True
的读操作都是成功的。这意味着frame
数组实际上并不是空的,由于某种原因它们只是以这种方式出现在您的打印输出中(例如,边缘上的所有值都是frame
,但是数组中有非零值)点0
所掩盖的部分)。然后,如果将打印语句更改为...
,则应该可以轻松地看到每个print(frame.sum())
中的至少有一些非零值frame
的值大多为ret
,则意味着大多数False
的读入失败,这又意味着空数组是期望值。如果Frame
在这种情况下确实仍在显示图像,则意味着正在发生某些真正非常奇怪的事情。