3

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

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

但是,当我尝试使用 OpenCV 和 python 以该名称(或 linux 给出的非符号化名称)访问相机时,我无法从相机中读取帧并且我的程序挂起。摄像头打开成功。我在 C++ 中创建了一个示例应用程序来测试它是否可能是与 python/opencv 相关的错误,但同样的事情也发生在 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...andTrying...消息,但没有收到Got消息。

关于如何解决这个问题的任何想法?

(顺便说一句,这都是在linux上)。

谢谢

4

1 回答 1

1

我想通了。当我在 VLC 中打开捕获时,我注意到它的文件名前缀为v4l2://. 当我在我的应用程序中做同样的事情时,它奏效了!

所以要参考上面,"/dev/my_custom_name"应该变成"v4l2:///dev/my_custom_name".

于 2012-10-19T14:58:38.447 回答