如何访问由opencv中的udev符号链接的网络摄像头

时间:2012-10-18 16:17:51

标签: c++ python linux opencv video-capture

我正在开发一个需要多个网络摄像头的应用程序。为了确保为应用程序的每个部分使用正确的网络摄像头,我创建了一些udev规则,将网络摄像头SYMLINK到特定名称,具体取决于序列号。

效果很好,我可以使用VLC和其他各种应用程序以该名称访问相机。

但是当我尝试使用OpenCV和python以该名称(或linux给出的非syminked名称)访问摄像机时,我无法从摄像机读取帧并且我的程序挂起。相机已成功打开。我用C ++创建了一个示例应用程序来测试它是否是一个python / opencv相关的bug,但同样的事情也发生在C ++中。

这是我的C ++测试应用程序不起作用:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main (int argc, const char * argv[])
{
    VideoCapture cap("/dev/my_custom_name");
    if (!cap.isOpened())
        return -1;

    cout << "Opened..." << endl;

    Mat img;
    namedWindow("video capture", CV_WINDOW_AUTOSIZE);
    while (true)
    {
        cout << "Trying..." << endl;
        cap >> img;
        cout << "Got" << endl;
        imshow("video capture", img);
        if (waitKey(10) >= 0)
            break;
    }
    return 0;
}

我收到了Opened...Trying...条消息,但未收到Got条消息。

有关如何解决此问题的任何想法?

(这都是linux btw)。

由于

1 个答案:

答案 0 :(得分:1)

我想出来了。当我在VLC中打开捕获时,我注意到它用v4l2://预先添加了文件名。当我在我的应用程序中做同样的事情时,它有效!

因此,为了引用上述内容,"/dev/my_custom_name"应该成为"v4l2:///dev/my_custom_name"