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

这里有什么问题?

4

4 回答 4

23

从 a读取 ( cam.read())VideoCapture返回一个元组(return value, image)。使用第一项检查读取是否成功,如果成功,则继续使用返回的image.

这记录在https://opencv-tutorial.readthedocs.io/en/latest/intro/intro.html#capture-live-video

于 2012-12-21T12:50:21.963 回答
3

mmgp 所说的一切都是正确的;cam.read()首先返回一个布尔值,指示读取是否成功,然后返回图像本身(如果返回值为 ,则为空False)。另请注意,如果您不使用任何返回值,则可以将该部分设置为_,这会告诉 Python“忽略我”;那条线看起来像_, image = cam.read(). 此外,在调用时指定相机所在的索引(通常为 0,如果您只连接了一个相机)通常是一种很好的做法cv2.VideoCapture(),这样,如果您确实连接了多个相机,OpenCV 就会知道要连接哪个相机读取(否则它可能会崩溃,因为它不知道该怎么做)。

于 2015-05-15T10:13:58.437 回答
0

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

试试这个从默认相机捕捉

cam = cv2.VideoCapture(0)

试试这个从网络摄像机捕获

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
于 2018-07-18T06:55:42.960 回答
0

如果您尝试使用内置网络摄像头捕获视频,那么闲置的代码行将为您提供最佳效果cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

于 2021-09-11T15:13:40.920 回答