我有这个代码试图从我的网络摄像头上捕获一个覆盆子pi的帧,并将其保存为图像。我使用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
这里有什么问题?
答案 0 :(得分:11)
从cam.read()
阅读(VideoCapture
)会返回元组(return value, image)
。使用第一项检查读数是否成功,如果是,则继续使用返回的image
。
这在http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html
中有记录答案 1 :(得分:3)
mmgp所说的一切都是现货; cam.read()
首先返回一个布尔值,指示读取是否成功,然后返回图像本身(如果返回值为False
则为空)。另请注意,如果您没有使用任何返回值,您可以将该部分设置为_
,告诉Python&#34;忽略我&#34 ;;那条线看起来像_, image = cam.read()
。此外,通常最好在调用cv2.VideoCapture()
时指定摄像机所在的索引(如果只连接了一台摄像机,则通常为0),这样,如果您连接了多台摄像机, OpenCV知道要读取哪个摄像头(否则它可能会崩溃,因为它不知道该怎么做)。
答案 2 :(得分: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