c++ - 如何访问由 udev 在 opencv 中链接的网络摄像头

标签 c++ python linux opencv video-capture

我正在开发一个需要多个网络摄像头的应用程序。为了确保应用程序的每个部分都使用正确的网络摄像头,我创建了一些 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...Trying... 消息,但没有收到 Got 消息。

关于如何解决这个问题有什么想法吗?

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

谢谢

最佳答案

我想通了。当我在 VLC 中打开捕获时,我注意到它以 v4l2:// 作为文件名的前缀。当我在我的应用程序中执行相同操作时,它成功了!

因此引用上面的内容,"/dev/my_custom_name" 应该变成 "v4l2:///dev/my_custom_name"

关于c++ - 如何访问由 udev 在 opencv 中链接的网络摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959150/

相关文章:

C++ 概念 Same 和 Assignable

linux - 依次运行 3 个作业

linux - 内核将 Azure 上的虚拟磁盘识别为 hda 和 sda

c++ - 使用 ns2 以混杂模式监控数据包

c++ - 将节点数组(可变长度)转换为 const float** 以调用 opencv.calcHist

c++ - 子字大小标志的线程安全

python - 在数据库中已有数据之后添加的 UUID 字段。有没有办法为现有数据填充 UUID 字段?

python - 如何关闭 while 循环然后执行另一个代码块? while 循环总是重复

python - 不能将 PySide 与 Anaconda 一起使用

c - 如何在c linux中销毁线程