我正在开发一个需要多个网络摄像头的应用程序。为了确保应用程序的每个部分都使用正确的网络摄像头,我创建了一些 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/