如何访问OpenCV中UDEV与UDEV相关的网络摄像头

how to access a webcam that was symlinked by udev in opencv

本文关键字:UDEV 摄像头 网络 何访问 访问 OpenCV      更新时间:2023-10-16

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

这很好,我可以使用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...Trying...消息,但没有Got消息。

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

(这全都在Linux BTW上)。

谢谢

我弄清楚了。当我在VLC中打开捕获量时,我注意到它使用v4l2://将文件名固定。当我在应用程序中做同样的事情时,它奏效了!

因此,在上面的参考文献中,"/dev/my_custom_name"应成为"v4l2:///dev/my_custom_name"