4

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

这不起作用:

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

4 回答 4

4
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.
于 2011-04-29T10:15:44.553 回答
1

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

IplImage prev = query(capture)

while(1)
   next = query(capture )

   opticalflow( prev, next )

   prev = cvCopy( next )
于 2013-02-12T09:31:36.720 回答
1

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

IplImage *imgA=cvQueryFrame( capture );

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

IplImage *imgB=cvQueryFrame( capture );

图像被重写并给出了指向相同缓冲区的指针。ImgA==ImgB。您必须在查询第一帧后进行复制,然后一切正常。

于 2013-02-12T05:25:30.857 回答
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);只是指向捕获的缓冲区,所以我可以将帧保存在另一种内存情况下。

于 2017-08-03T09:12:38.540 回答