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

我有以下代码:

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

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

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

提前致谢

编辑:我从谷歌发现调用 cvQueryFrame() 两次返回相同的指针。现在我有点困惑。如果我在 while 循环中只使用一次调用它,帧会进步,但如果我调用它两次就不会?有没有一种简单的方法来抓取两帧?

最佳答案

cvQueryFrame() 返回指向 OpenCV 的“私有(private)”内部缓冲区的指针,它总是用最后一个抓取的帧填充。
如果您想要 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 个分配的灰度图像之间交换指针。

10-08 05:37