【问题标题】:Using device name instead of ID in OpenCV method VideoCapture.open()在 OpenCV 方法 VideoCapture.open() 中使用设备名称而不是 ID
【发布时间】:2013-12-14 12:39:57
【问题描述】:

我的/dev 文件夹中有很多视频设备(例如video1video2、...、video9)和一个始终指向有效设备的/dev/video(其中,当然,可以改变)。 我想用cv::Videocapture用OpenCV打开/dev/video设备,发现只有两种打开方式:

VideoCapture::VideoCapture(const string& filename)
VideoCapture::VideoCapture(int device)

第一个打开一个文件,第二个打开/dev/video[device]

有什么办法可以做类似cap = cv::VideoCapture("/dev/video"); 的事情吗?

【问题讨论】:

    标签: c++ opencv video camera video-capture


    【解决方案1】:

    使用当前的 OpenCV 3.2.0,您可以像这样创建新的捕获:

    cv::VideoCapture cap("/dev/video20", cv::CAP_V4L);
    

    它是额外的构造函数之一:

    VideoCapture (const String &filename, int apiPreference)
    使用 API Preference 打开视频文件或捕获设备或 IP 视频流以进行视频捕获。

    这也可以通过 open 函数实现:

    cap.open("/dev/video20", cv::CAP_V4L);
    

    我已经在 Kubuntu 16.10 下使用当前 git master 自己编译的 openCV 成功测试了这个。

    【讨论】:

    • 我也有同样的问题,有什么适用于 Windows 的解决方案吗?
    【解决方案2】:

    通过查看 OpenCV 2.4.11 (cap.cpp) 的源代码,您可以看到使用 const string& 文件名的重载正在调用“cvCreateFileCapture”,它使用其他插件作为 FFMPEG 或 GS​​treamer 来加载文件,所以答案是否定的.

    bool VideoCapture::open(const string& filename)
    {
       if (isOpened()) release();
       cap = cvCreateFileCapture(filename.c_str());
       return isOpened();
    }
    

    【讨论】:

      【解决方案3】:

      最好的办法是解析设备的 ID。

      #include <regex>
      #include <boost/filesystem.hpp>
      
      ...
      
      boost::filesystem::path path( "/dev/video3" );
      auto target = boost::filesystem::canonical(path).string();
      std::regex exp( ".*video(\\d+)" );
      std::smatch match;
      std::regex_search( target, match, exp );
      auto id = strtod( match[1] );
      auto cap = cv::VideoCapture( id );
      

      注意使用canonical() 使路径成为绝对路径并解析任何符号链接。这样即使你给它来自/dev/v4l/by-id/dev/v4l/by-path 的v4l 设备路径,它也可以工作,例如:

      "/dev/v4l/by-id/usb-046d_0990_1188AD49-video-index0"
      "/dev/v4l/by-path/pci-0000:00:13.2-usb-0:4.4.4:1.0-video-index0"
      

      【讨论】:

        猜你喜欢
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        相关资源
        最近更新 更多