【发布时间】:2026-02-06 01:55:01
【问题描述】:
我正在使用 OpenCV 打开和读取多个网络摄像头。一切正常,但我似乎无法找到一种方法来知道相机是否可用。
我试过这段代码(cam 2 不存在):
import cv2
try:
c = cv2.VideoCapture(2)
except:
print "Cam 2 is invalid."
但这只会打印很多错误:
VIDEOIO ERROR: V4L: index 2 is not correct!
failed to open /usr/lib64/dri/hybrid_drv_video.so
Failed to wrapper hybrid_drv_video.so
failed to open /usr/lib64/dri/hybrid_drv_video.so
Failed to wrapper hybrid_drv_video.so
GStreamer Plugin: Embedded video playback halted; module v4l2src0 reported: Internal data stream error.
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline
) in cvCaptureFromCAM_GStreamer, file /builddir/build/BUILD/opencv-3.2.0/modules/videoio/src/cap_gstreamer.cpp, line 832
VIDEOIO(cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, reinterpret_cast<char *>(index))): raised OpenCV exception:
/builddir/build/BUILD/opencv-3.2.0/modules/videoio/src/cap_gstreamer.cpp:832: error: (-2) GStreamer: unable to start pipeline
in function cvCaptureFromCAM_GStreamer
OpenCV Error: Unspecified error (unicap: failed to get info for device
) in CvCapture_Unicap::initDevice, file /builddir/build/BUILD/opencv-3.2.0/modules/videoio/src/cap_unicap.cpp, line 139
VIDEOIO(cvCreateCameraCapture_Unicap(index)): raised OpenCV exception:
/builddir/build/BUILD/opencv-3.2.0/modules/videoio/src/cap_unicap.cpp:139: error: (-2) unicap: failed to get info for device
in function CvCapture_Unicap::initDevice
CvCapture_OpenNI::CvCapture_OpenNI : Failed to enumerate production trees: Can't create any node of the requested type!
<VideoCapture 0x7fa5b5de0450>
不抛出异常。稍后使用c.read() 时,我确实得到False,但我想在程序的初始化阶段执行此操作。
那么,我如何找出我拥有的有效摄像机数量或检查某个数量是否“映射”到有效摄像机?
【问题讨论】:
-
"没有抛出异常":是的,因为你发现它们都没有处理。始终只捕获您愿意处理的异常。
-
@AndrasDeak
print "Cam 2 is invalid"从未显示。 -
啊,这让它更有趣了(但我坚持我之前的说法)。那么......它打印什么样的错误?请阅读minimal reproducible example和How to Ask:P
-
@AndrasDeak 添加
import cv2是制作此 MCV 所需的全部内容。我也添加了错误。 -
Úsing
cv2.VideoCapture( invalid device number )不会引发异常。它构造了一个包含无效设备的<VideoCapture object>——如果你使用它,你会得到异常。测试None和not IsOpen()的构造对象以清除无效对象。有关代码示例,请参见答案。