现在我的问题是:如果是指第一帧的指针,
IplImage *frame1,*frame2;
frame1 = cvQueryFrame(capture);
frame2 = cvQueryFrame(capture);
是指向第二帧的指针吗?那么两个调用会读连续的帧吗?
我以为我会先检查一下自己,但是指针frame1
frame2
似乎具有相同的十六进制价值。 :S我只需要一次捕获两个帧,然后需要处理它们。
提前三
Edit:我从Google找到了呼叫
cvQueryFrame()
两次返回相同的指针。现在我有些困惑。如果我只使用一次循环一次来调用它,则框架会进展,但如果我称其为两次?有一种简单的方法可以抓住两个帧吗?
frame1
将指针返回到OpenCV的“私人”内部缓冲区,它总是用最后一个抓取的框架填充。 如果需要2帧,则需要缓存一个副本。为上一个帧分配(例如使用
frame2
)空间(例如,使用
cvQueryFrame()
),您可以使用cvQueryFrame()
not
在循环内使用
cvCloneImage()
,因为由于内部内存分配(和Deallocations,否则您还会有内存泄漏),因此效率非常低。
代码看起来像这样:
cvCopy()
通常,您可以通过进行转换来避免此“多余”复制时间。 例如,假设您的显示为彩色,但是您的处理是在灰度中。您只需要在灰度中连续两份副本。由于您需要无论如何都需要转换为灰度,因此您可以直接从捕获的框架中执行此操作,从而避免冗余
cvCloneImage()
。为了保存上一个帧,您只需在两个分配的灰度图像之间交换指针。
ok!
您必须复制框架。 frame1 = cvqueryframe(捕获);是您所说的指针。 我发现的代码是:
IplImage* currFrame = 0;
IplImage* prevFrame = 0;
CvCapture* cap = cvCaptureFromAVI("sample.avi");
currFrame = cvQueryFrame( cap );
// Clone the frame to have an identically sized and typed copy
prevFrame = cvCloneImage( currFrame );
while(currFrame = cvQueryFrame( cap ))
{
// process the video using currFrame and prevFrame...
// ...
// When done, overwrite prevFrame with current copy in preparation
// for the next frame.
cvCopy( currFrame , prevFrame);
}
cvReleaseImage( &img1 );
cvReleaseCapture( &cap );
您可以用while替换为waitkey或其他任何事情
cvCopy()
IplImage* img1(null), img2(null);
CvCapture* cap = cvCaptureFromAVI("mavideo.avi");
img2 = cvQueryFrame( cap );
img1 = cvCloneImage( img2 ); // on alloue une nouvelle image
while( cvGrabFrame( cap ) )
{
cvCopy( img2, img1 ); // copie de l'image, pas du pointeur
img2 = cvRetrieveFrame( cap );
}
cvReleaseCapture( &cap );
cvReleaseImage( &img1 );
img2 = cvQueryFrame( cap );
我不知道我是否很清楚...我呆在这里^^
enjoy;)
laurent
从洛朗(Laurent)的回答中关注:我相信关键是cvcloneimage()。 CVCloneImage创建了原始图像的新副本,包括标题,ROI,Imagedata等,然后将Frame2指向此新数据。CvQueryFrame是CvGrabFrame和CvreTrieveFrame的包装器,我不想将功能分开,因此,使用一个小的修改,我仍然可以使用cvqueryframe。
贝洛是我的修改解决方案。
img2 = cvRetrieveFrame( cap );
我希望您了解我在这里做了什么。
随时提出更多问题。