我正在尝试使用2个罗技C310网络摄像头创建立体视觉。 但结果还不够好。其中一个视频与另一个视频相比滞后。
这是我使用VC ++ 2010的openCV程序:
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
try
{
VideoCapture cap1;
VideoCapture cap2;
cap1.open(0);
cap1.set(CV_CAP_PROP_FRAME_WIDTH, 1040.0);
cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 920.0);
cap2.open(1);
cap2.set(CV_CAP_PROP_FRAME_WIDTH, 1040.0);
cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 920.0);
Mat frame,frame1;
for (;;)
{
Mat frame;
cap1 >> frame;
Mat frame1;
cap2 >> frame1;
transpose(frame, frame);
flip(frame, frame, 1);
transpose(frame1, frame1);
flip(frame1, frame1, 1);
imshow("Img1", frame);
imshow("Img2", frame1);
if (waitKey(1) == 'q')
break;
}
cap1.release();
return 0;
}
catch (cv::Exception & e)
{
cout << e.what() << endl;
}
}
如何避免滞后?
答案 0 :(得分:2)
你可能正在使usb公共汽车饱和。
尝试将一个插在前面,另一个插在后面(希望降落在不同的公交车上),
或减小帧大小/ FPS以产生更少的流量。
答案 1 :(得分:1)
我担心你不能这样做。 opencv Videocapture真的只是用于测试,它使用最简单的底层操作系统功能,并没有真正尝试做任何聪明的事情。
此外,即使您可以找到较低级别的API与他们交谈,简单的网络摄像头也无法实现可同步控制。
如果您需要为项目使用简单的USB网络摄像头,最简单的方法是让外部定时LED以几赫兹闪烁并检测每个摄像头中的灯光并使用它来同步帧。
答案 2 :(得分:0)
我知道这篇文章已经老了,但最近我不得不处理同样的问题......
我认为你没有让USB总线饱和。如果你是,你应该在终端有一个明确的消息。实际上,VideoCapture对象的创建速度很慢,我很确定这是你滞后的原因:你初始化你的第一个VideoCapture对象cap1,cap1开始抓取帧,你初始化你的第二个VideoCapture cap2,cap2开始抓取帧然后你开始从cap1和cap2获取你的帧,但是cap1存储的第一帧比cap2存储的帧早,所以...你有一个滞后。
如果你真的想要使用opencv,你应该做的就是添加一些线程:一个处理左帧而另一个处理右帧,除了保存最后一帧之外什么都不做(所以你总是会处理只有最新的帧)。如果你想获得你的帧,你只需要从这些线程中获取它们。
如果你需要here,我已经做了一些事情。