我正在从相机中获取输入。更清楚我添加了一张照片: 2个摄像头连接在同一个USB端口上
OpenCV
如下:
#define CamLeft 2
#define CamRight 0
#define WIN_L "win_l"
#define WIN_R "win_r"
int main(int argc, const char * argv[])
{
VideoCapture capLeft(CamLeft);
bool opened = capLeft.isOpened();
if(!opened /*|| !capRight.isOpened()*/) // check if we succeeded
return -1;
Mat edges;
namedWindow(WIN_L,1);
for(;;)
{
Mat frameL;
Mat frameR;
capLeft >> frameL; // get a new frame from camera
cvtColor(frameL, edges, CV_RGB2RGBA);
imshow(WIN_L, edges);
if(waitKey(30) >= 0) break;
}
return 0;
}
所以我创建一个名为“win_l”的窗口代表左侧窗口并处理视频捕获。它运作良好。现在我升级了我的代码以支持这样的另一个相机:
int main(int argc, const char * argv[])
{
VideoCapture capLeft(CamLeft);
VideoCapture capRight(CamRight);
bool opened = capLeft.isOpened();
if(!opened /*|| !capRight.isOpened()*/) // check if we succeeded
return -1;
Mat edges;
namedWindow(WIN_L,1);
namedWindow(WIN_R,1);
for(;;)
{
Mat frameL;
Mat frameR;
capLeft >> frameL; // get a new frame from camera
cvtColor(frameL, edges, CV_RGB2RGBA);
imshow(WIN_L, edges);
imshow(WIN_R, edges);
if(waitKey(30) >= 0) break;
}
return 0;
}
但是后来我没有看到调试器点击这一行:bool opened....
它是从2个摄像头捕获的正确方法吗?
答案 0 :(得分:0)
我怀疑USB带宽分配问题。不太确定这是否是原因,但通常情况下是2个单独的相机,每个单独的USB线。
但是,不过,请试一试。解决该问题的一些方法:1)在捕获线的行之间放置一个Sleep(ms)。 2)使用较低的分辨率会降低每个摄像头使用的带宽。 3)使用MJPEG格式(压缩帧)。
编辑:
我遇到过这个网站,WEBCAM AND USB DRIVERS,您可能会想要阅读它。
无论如何,我不确定两个摄像头是否只能通过一个USB端口同时运行,原因如上所述(我实际上已经忘记了它。我的不好):
USB:通用串行总线,顾名思义,它是一种串行数据传输,这意味着它只能从一台设备向/从计算机发送数据。
代码中发生的事情是死锁,导致程序无法进展,即使在一台摄像机上也是如此。
导致这种情况的两个原因:
1)我怀疑每个摄像头的驱动程序是否一直在相互覆盖,发送I / O请求包(IRP)和"管道"继续接收和处理每个请求,系统在分配后立即释放每个资源。这种情况一直在继续。
2)第二台相机有饥饿,如果没有分配资源,程序就无法进行。因此,系统停留在第二台摄像机不断请求资源的循环中。
然而,如果有人使用单个串行总线发明这个2网络摄像头,当每个摄像头需要它自己的通道/管道与系统通信时,这将是奇怪的。也许您想直接与制造商核实?也许他们想出了一个解决方法,因此他们发明了这款相机?
如果没有,本发明的唯一目的是非常多余的。我只能想到一个安全目的,一个配置为夜视,一个配置为日视图。