cvQueryFrame是否预先为帧提供缓冲区?

时间:2011-08-30 18:36:00

标签: c++ c opencv

如果我这样做:

while(1) { 
   //retrieve image from the camera
   webCamImage=cvQueryFrame(camera) // where 'camera' is cvCreateCameraCapture(0)

   //do some heavy processing on the image that may take around half a second
   funcA()
}

现在当我进行连续迭代时,似乎webCamImage落后了!

即使我移动相机,webCamImage也需要很长时间才能更新到新的视野,并且它会一直显示和处理以前的视野相机帧。

我假设cvQuery有一些缓冲区可以检索帧。

请告诉我如何在每次迭代时获取更新的相机视图?

非常感谢

1 个答案:

答案 0 :(得分:1)

cvQueryFrame只是一个包装器,它调用另外两个函数:cvGrabFrame,它可以非常快速地从摄像机获取数据,cvRetrieveFrame,它解压缩这些数据并将其放入{ {1}}。如果您需要立即捕获的帧,只需抓取帧,然后检索它以便以后处理。

请参阅http://opencv.jp/opencv-1.0.0_org/docs/ref/opencvref_highgui.htm FMI

尽管如此,我使用IplImage和一个典型的网络摄像头,我可以毫不费力地获得每秒几十帧。任何滞后的部分实际上都在你的cvQueryFrame电话中的可能性? 编辑:从代码中的注释中,我看到funcA()确实是缓慢的部分。如果执行需要半秒钟,你将每半秒从funcA()获得一个新帧,就像你描述的那样。尝试更快地使cvQUeryFrame,或将其放在一个单独的线程中。

作为友情提醒,funcA / IplImage返回的cvQueryFrame不应被用户修改或删除;它是OpenCV用于存储内容的内部系统的一部分,如果你正在做任何有趣的事情,你应该复制一份。我不知道你是否已经这样做了,但是当我开始时我当然做错了。