【问题标题】:Listing available devices in python-opencv在 python-opencv 中列出可用设备
【发布时间】:2011-12-24 01:52:37
【问题描述】:

我的笔记本电脑上连接了两个网络摄像头(一个内置),它们都可以工作。 (如果我使用 Cheese,这是 Ubuntu 附带的一种网络摄像头,它使用外部摄像头)。如果我使用

cap = cv.CreateCameraCapture(0)

cap = cv.CreateCameraCapture(-1)

我得到了我的内置网络摄像头。如果我使用

cap = cv.CreateCameraCapture(1)

它不起作用,对象“cap”显示为:

<Capture (nil)>

与 CaptureFromCAM 相同。所以我想知道openCV正在尝试做什么以及为什么它似乎不知道第二台相机。应该有两个设备可用(两者都有 /dev/videoN 条目)。

【问题讨论】:

标签: python linux opencv hardware


【解决方案1】:

这是 OpenCV 的一个普遍问题,如下所示。似乎只有内置或第一个 USB 摄像头(仅当您没有内置摄像头时)在 OpenCV 中有效:

How to use a camera with OpenCV

Cannot access usb webcam through OpenCV, Cygwin

OpenCV capture from USB not iSight (OSX)

目前,无法提取此功能请求中列出的摄像头数量:

https://code.ros.org/trac/opencv/ticket/935

【讨论】:

  • 如果您使用“try”和“except”函数来排序“计数”它可以打开多少个摄像头而不会出错?
【解决方案2】:

我认为你应该试试这个:

import cv2

cap = cv2.VideoCapture(1)

while True:
    _, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

【讨论】:

    【解决方案3】:

    我已经能够通过遍历网络摄像头索引来解决这个问题,直到读取该摄像头不再返回任何内容:

    index = 0
    arr = []
    while True:
        cap = cv2.VideoCapture(index)
        if not cap.read()[0]:
            break
        else:
            arr.append(index)
        cap.release()
        index += 1
    return arr
    

    此方法返回读取时返回的所有索引的列表;我确信它可以改进,但几乎没有超过几个网络摄像头,而且运行速度非常快。

    【讨论】:

    • 有人应该更新这个问题的答案。没有理由不能使用基本设计模式来查找已连接或可用的设备
    【解决方案4】:

    @Patrick 的回答很好,但我想改进它,目前无法发表评论。

    我认为 Patricks 设置假定相机之间没有空索引。但就我而言,我的内置摄像头位于索引 0,而 USB 网络摄像头位于索引 2。所以“if not cap.read()[0]”在索引 1 处脱离了 while 循环,永远不会捕捉到其他摄像头.我们必须指定我们愿意检查多少索引,而不是添加那些为空的索引。

    def returnCameraIndexes():
        # checks the first 10 indexes.
        index = 0
        arr = []
        i = 10
        while i > 0:
            cap = cv2.VideoCapture(index)
            if cap.read()[0]:
                arr.append(index)
                cap.release()
            index += 1
            i -= 1
        return arr
    

    这成功地为我提供了我需要的索引。再次感谢 Patrick 的布局!

    【讨论】:

    • 感谢@pydrink,我还需要跳过 0 索引,因为它是内置的,我只需要“额外”的 :)
    • @alcor 我懒得确认,因为我现在没有参与使用 OpenCV,但我似乎记得体验过内置摄像头不一定总是在索引 0 ,在运行我的代码之间,我可能已经拔下 USB 摄像头并再次插入,可能使用不同的 USB 端口 :-)
    【解决方案5】:

    对于 Windows,您可以构建一个 .pyd 扩展名。 https://github.com/yushulx/python-capture-device-list

    目前还没有一种简单的跨平台方式;理想情况下,有人会为每个操作系统整理一个解决方案,然后将它们构建到 .pyd 中。

    【讨论】:

      【解决方案6】:

      我相信在 Linux 下,视频输入的有效索引是 /dev 目录中 videoN 设备的编号。 因此,以下将给出有效索引的列表:

      import os
      devs = os.listdir('/dev')
      vid_indices = [int(dev[-1]) for dev in devs 
                     if dev.startswith('video')]
      vid_indices = sorted(vid_indices)
      vid_indices
      

      【讨论】:

      • 如果使用上述解决方案,请务必查看这个 askubuntu 问题:askubuntu.com/questions/1123601/… 似乎 /dev 中通常为每个视频设备列出两个设备,一个用于捕获,一个用于元数据。
      【解决方案7】:

      可以不使用 cap.read() 来创建相机列表。

      import cv2
      
      index = 0
      arr = []
      while True:
          cap = cv2.VideoCapture(index)
          try:
              if cap.getBackendName()=="MSMF":
                  arr.append(index)
          except:
              break
          cap.release()
          index += 1
      
      print(arr)
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2012-12-25
      • 2013-11-03
      相关资源
      最近更新 更多