使用cvQueryframe读取连续帧OpenCV

Ath*_*vaI 4 opencv image-processing

关于OpenCV中的cvQueryFrame(),我有一个基本问题.

我有以下代码:

IplImage *frame1,*frame2;
frame1 = cvQueryFrame(capture);
frame2 = cvQueryFrame(capture);

现在我的问题是:if frame1是指向第一帧frame2的指针,是指向第二帧的指针吗?那么这两个cvQueryFrame()调用会读取连续的帧吗?

我想我会首先检查自己,但指针frame1,frame2似乎有相同的十六进制值.:我只需要一次捕获两个帧然后需要处理它们.

提前致谢

编辑:我发现从谷歌调用cvQueryFrame()两次返回相同的指针.现在我有点困惑.如果我在while循环中只使用一次调用它,帧会进展但如果我调用它两次则没有?抓住两个框架有简单的方法吗?

Adi*_*vit 9

cvQueryFrame()返回指向OpenCV的"私有"内部缓冲区的指针,它始终填充最后一个抓取的帧.
如果您想要2帧,则需要缓存副本.cvCloneImage()为前一帧分配(例如使用)空间后,您可以使用cvCopy()仅复制图像数据.千万不能使用cvCloneImage()内循环,因为这是由于内部内存分配效率非常低(和释放,否则会出现内存泄漏以及).

更新:代码看起来像这样:

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 );
Run Code Online (Sandbox Code Playgroud)

注意:通常,您可以通过转换来避免这种"冗余"复制时间.
例如,假设您的显示器是彩色的,但您的处理是灰度的.您只需要连续2个灰度副本.由于您无论如何都需要转换为灰度,您可以直接从捕获的帧中执行此操作,从而避免冗余cvCopy().要保存前一帧,您只需在两个分配的灰度图像之间交换指针.