我有这个代码试图从树莓派上的网络摄像头捕获一个帧,并将其保存为图像。我使用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
怎么了?
从一个VideoCapture
读取(cam.read()
)返回一个元组(return value, image)
。对于第一项,您检查读数是否成功,如果成功,则继续使用返回的image
。
这个文档在https://opencv-tutorial.readthedocs.io/en/latest/intro/intro.html#capture-live-video
mmgp说的都是对的;cam.read()
首先返回一个布尔值,指示读取是否成功,然后返回图像本身(如果返回值为False
,则图像本身为空)。还要注意,如果你不使用任何返回值,你可以将该部分设置为_
,它告诉Python"忽略我";这条线看起来像_, image = cam.read()
。此外,在调用cv2.VideoCapture()
时,指定相机所在的索引(通常是0,如果你只有一个相机连接)是一个很好的做法,这样,在你有多个相机连接的情况下,OpenCV知道从哪个相机读取(否则它可能只是崩溃,因为它不知道该怎么做)。
您应该在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
如果您正在尝试使用内置网络摄像头捕获视频,那么以下代码行将为您提供最佳效果cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)