cv2.videocapture.read() 不返回 numpy 数组。

10

我有这段代码试图从我的树莓派上的网络摄像头捕获一帧,并将其保存为图像。我使用的是opencv 2,但在运行代码时出现奇怪的错误。

import time
import sys
from subprocess import call
import cv2

cam = cv2.VideoCapture()

while True:
        cam.open(-1)
        image = cam.read()
        cv2.imwrite("current.jpeg",image)
        time.sleep(10);

这就是程序返回的内容:

VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument

Traceback (most recent call last):
  File "kvamskogen.py", line 18, in <module>
    cv2.imwrite("current.jpeg",image)
TypeError: <unknown> is not a numpy array

这里有什么问题?


2
你可以忽略FTP部分和已注释的行。这样做可以帮助那些试图帮助你的人更好地理解你的问题,而不是a)在你的示例中留下额外的代码,b)解释为什么它不相关。请参阅http://sscce.org/。 - YXD
4个回答

27

@mmpg 你知道 cam.read() 抛出异常的可能原因吗?我的应用在运行一段时间后开始从 cam.read() 抛出异常。它使用 .set(3, 640).set(4, 360) 显示预览帧,但是当使用 .set(3, 1920).set(4, 1080) 时会抛出 NULL object passed to Py_BuildValue 异常。cam.read() 甚至不能返回元组中的 False,它直接崩溃了。 - Rafael Oliveira

3
一切mmgp所说的都正确; cam.read()首先返回一个布尔值,指示读取是否成功,然后是图像本身(如果返回值为 False 则为空)。另外请注意,如果您没有将返回值用于任何内容,则可以将该部分设置为 _ ,这告诉Python“忽略我”;那行代码看起来会像这样: _, image = cam.read()。另外,在调用cv2.VideoCapture()时,通常最好指定摄像机位于哪个索引(如果您只连接了一个摄像机,则通常为0),以便在您连接了多个摄像机时,OpenCV 知道从哪个摄像机读取(否则它可能会因为不知道该做什么而崩溃)。

1
就此而言,将变量命名为“_”并不会告诉Python任何信息。Python只是将其视为另一个变量名称。这只是程序员用来告诉自己和其他人你不会对这个值做任何事情的惯例。 - Dustin Wyatt

0

cv2.VideoCapture()中应该使用参数

尝试使用以下代码从默认摄像头捕获

cam = cv2.VideoCapture(0)

尝试使用此方法从IP摄像头中捕获视频:
cam = cv2.VideoCapture('http://ip-address') # to check video source's ip address right click video and select "copy image address" and put the exact address in above line of code

0
如果您正在尝试使用内置网络摄像头捕获视频,则以下代码行将为您提供最佳结果: cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接