Python中的OpenCV,获取网络摄像头流正常,但打印错误信息

2 投票
2 回答
11659 浏览
提问于 2025-04-17 16:22

我正在写一个程序,需要用到摄像头的画面,并对画面进行人脸检测。整体运行得不错,但在终端上却出现了错误信息。尽管我使用了 cv.CaptureFromCAM(-1) 这个命令,它可以检测到我电脑上连接的任何摄像头,但问题依然存在。我还尝试用 cv2 来代替 cv,结果还是出现了同样的错误:

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

需要注意的是,我现在运行的唯一代码就是 cv.CaptureFromCAM(-1)。哦,对了,我使用的是 Python 2.7。

 import cv
 cv.CaptureFromCAM(-1)

有人能告诉我该怎么解决这个问题吗?谢谢。

2 个回答

-1

尝试:

    import cv
    cv.NamedWindow("Capture", 1)
    cap_1 = cv.CaptureFromCAM(-1)
    While True:
     Frame = cv.QueryFrame(cap_1)
     cv.ShowImage("Capture", Frame)
     cv.WaitKey(1)

另外,使用 cv2 和 VideoCapture:

from cv2 import *
cam = VideoCapture(0)   
s, img = cam.read()

补充说明:我在网上搜索这个错误时发现了以下信息: 消息“VIDIOC_QUERYMENU: Invalid argument”是来自 opencv 的 cap_libv4l.cpp 文件。 在列出菜单项时,“querymenu.id”的值仍然设置了“V4L2_CTRL_FLAG_NEXT_CTRL”。 以下补丁可以解决这个问题:

— OpenCV-2.3.1/modules/highgui/src/cap_libv4l.cpp   2011-09-12 20:41:29.000000000 +0200
+++ opencv/modules/highgui/src/cap_libv4l.cpp   2011-12-01 19:00:37.503761631 +0100
@@ -489,7 +489,7 @@
{
// printf (” Menu items:\n”);
CLEAR (capture->querymenu);
- capture->querymenu.id = capture->queryctrl.id;
+ capture->querymenu.id = capture->queryctrl.id & ~V4L2_CTRL_FLAG_NEXT_CTRL;
for (capture->querymenu.index = capture->queryctrl.minimum;
(int)capture->querymenu.index queryctrl.maximum;
capture->querymenu.index++)
1

我遇到了同样的错误信息。不过在我的情况下,这些错误并不严重,只是说明Python正在使用v4l2来检查一些参数,而这些参数对我的相机和操作系统组合来说是无效的。

在我的情况下

>>> cap = cv2.VideoCapture(0)
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
...

但是

ret, frame = cap.read()

返回的结果是ret=true,并且得到了一个numpy图像数组作为帧。

我的视频摄像头是Logitech的HD Webcam C910。我是在beagleboneblack上运行Angstrom系统。

撰写回答