使用cvQueryframe读取OpenCV的连续帧
image-processing
opencv
10
0

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

我有以下代码:

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

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

我以为我会先检查一下自己,但指针frame1frame2似乎具有相同的十六进制值。 :s我只需要一次捕获两个帧,然后需要对其进行处理。

提前致谢

编辑:我从谷歌发现,调用cvQueryFrame()两次返回相同的指针。现在我有些困惑。如果我仅在一次循环中调用一次,则帧会前进,但是如果我调用两次,则帧不会前进吗?有没有简单的方法来抓取两个框架?

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

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

注意:通常,您可以通过执行转换来避免此“冗余”复制时间。
例如,假设您的显示是彩色的,但是您的处理是灰度的。您只需要2个连续的灰度副本。由于仍然需要转换为灰度,因此可以直接从捕获的帧中进行转换,从而避免了冗余cvCopy() 。要保存前一帧,您只需在分配的2张灰度图像之间交换指针。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号