如何正确检查相机是否可用?

新手上路,请多包涵

我正在使用 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 ,但我想在程序的初始化阶段执行此操作。

那么,我如何找出我有多少个有效相机或检查某个数字是否“映射”到一个有效相机?

原文由 Bart Friederichs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 762
2 个回答

使用 cv2.VideoCapture( invalid device number ) 不会抛出异常。它构造一个 <VideoCapture object> 包含一个无效的设备——如果你 使用 它,你会得到异常。

测试 Nonenot isOpened() 的构造对象,以清除无效对象。


对我来说这很有效(1 台笔记本电脑摄像头设备):

 import cv2 as cv

def testDevice(source):
   cap = cv.VideoCapture(source)
   if cap is None or not cap.isOpened():
       print('Warning: unable to open video source: ', source)

testDevice(0) # no printout
testDevice(1) # prints message

输出为 1:

 Warning: unable to open video source:  1

示例来自: https ://github.com/opencv/opencv_contrib/blob/master/samples/python2/video.py 第 159ff 行

cap = cv.VideoCapture(source)
    if 'size' in params:
        w, h = map(int, params['size'].split('x'))
        cap.set(cv.CAP_PROP_FRAME_WIDTH, w)
        cap.set(cv.CAP_PROP_FRAME_HEIGHT, h)
if cap is None or not cap.isOpened():
    print 'Warning: unable to open video source: ', source

原文由 Patrick Artner 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 Linux 中可用的另一种解决方案是在 VideoCapture() 调用中使用 /dev/videoX 设备。插入摄像头时,设备就在那里。与 glob() 一起,获取所有摄像头是微不足道的:

 import cv2, glob

for camera in glob.glob("/dev/video?"):
    c = cv2.VideoCapture(camera)

当然需要检查 c 使用 isOpened() ,但你确定你只扫描可用的相机。

原文由 Bart Friederichs 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题