从网络摄像头捕获Opencv连续帧

时间:2011-04-29 07:45:10

标签: c++ opencv webcam video-capture opticalflow

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

这不起作用:

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 );

有什么想法吗?我希望这不是一个愚蠢的问题,但我怀疑它是:/抱歉提前。 谢谢!

4 个答案:

答案 0 :(得分: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 :(得分:1)

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

IplImage *imgA=cvQueryFrame( capture );

你得到指向其内部缓冲区的指针,其中包含图像。现在做的时候:

IplImage *imgB=cvQueryFrame( capture );

重写图像,并给出指向同一缓冲区的指针。 IMGA == IMGB。查询第一帧后你必须复制,然后一切正常。

答案 2 :(得分:1)

循环之前的一个查询,循环内的另一个查询可能就足够了 (伪代码):

IplImage prev = query(capture)

while(1)
   next = query(capture )

   opticalflow( prev, next )

   prev = cvCopy( next )

答案 3 :(得分: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);只是指向捕获的缓冲区,所以我可以在另一种内存情况下保存帧。