2011-04-29 76 views
4

我正在开发一个Opencv(C++)实时光流应用程序。 我不明白如何捕捉两个连续帧来应用Lucas-Kanade Tracking方法。Opencv从网络摄像头捕获连续帧

这不起作用:

CvCapture* capture = cvCaptureFromCAM(1); 
IplImage *imgA=cvQueryFrame(capture); 
IplImage *imgB=cvQueryFrame(capture); 

我也曾经尝试这样做,但程序不会退出循环:

CvCapture* capture = cvCaptureFromCAM(1); 
IplImage *imgA=cvQueryFrame(capture); 
IplImage *imgB=cvCreateImage(cvSize(imgA),IPL_DEPTH_32F,3); 
while(cvNorm(imgA,imgB)==0) 
    imgB=cvQueryFrame(capture); 

任何想法?我希望这不是一个愚蠢的问题,但我怀疑它是:/提前对不起。 谢谢!

+0

这是合乎逻辑的,它不会退出循环,因为网络摄像头永远不会停止将其馈送到图像中。你有没有尝试用cvShowImage()在窗口中观察结果? – 2011-04-29 09:13:56

+1

“连续”是什么意思? – 2011-04-29 10:29:12

+0

我使用这个QTOpencv APP:[链接](http://qt-apps.org/content/show.php/Qt+Opencv+webcam+viewer?content=89995) cvwidget-> putImage(imgA); – EnneKappa 2011-04-29 10:34:14

回答

3
cv::Mat m1, m2; 
cv::VideoCapture cap(0); 

if(!cap.isOpened()) 
    ;// ... throw error here 

cap >> m1; 
cap >> m2; 

// m1 and m2 now contain consecutive frames. 
1

我解释了为什么原始代码不起作用。 cvQueryFrame每次重用相同的缓冲区。所以当你这样做时:

IplImage *imgA=cvQueryFrame(capture); 

你得到指向他的内部缓冲区的图像被保存。现在在做:

IplImage *imgB=cvQueryFrame(capture); 

图像被重写,并指向相同的缓冲区。 IMGA == IMGB。查询第一帧后必须复制,然后一切正常。在循环之前

1

一个查询,而另一个循环内可能足以在这里 (伪):

IplImage prev = query(capture) 

while(1) 
    next = query(capture) 

    opticalflow(prev, next) 

    prev = cvCopy(next) 
0
Mat* mImg; 
IplImage* _image; 
IplImage* image; 
CvCapture* capture = cvCaptureFromCAM(0); 

for (int i = 0; i < 15; i++) { 
    _image = cvQueryFrame(capture); 
} 

*image = *_image; 

我总是能满足的情况0xC0000005与此有关。我不知道我的代码有什么问题。我使用image = _image,因为我认为_image = cvQueryFrame(capture);只是指向捕获的缓冲区,所以我可以将该帧保存在另一个内存中。