我正在开发一个需要多个网络摄像头的应用程序。为了确保为应用程序的每个部分使用正确的网络摄像头,我创建了一些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)。
由于
答案 0 :(得分:1)
我想出来了。当我在VLC中打开捕获时,我注意到它用v4l2://
预先添加了文件名。当我在我的应用程序中做同样的事情时,它有效!
因此,为了引用上述内容,"/dev/my_custom_name"
应该成为"v4l2:///dev/my_custom_name"
。