我正在使用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 );
有什么想法吗?我希望这不是一个愚蠢的问题,但我怀疑它是:/抱歉提前。 谢谢!
答案 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);
只是指向捕获的缓冲区,所以我可以在另一种内存情况下保存帧。