【问题标题】:Does cvQueryFrame have buffer for frames in advance?cvQueryFrame 是否提前为帧提供缓冲区?
【发布时间】:2011-08-30 18:36:00
【问题描述】:

如果我这样做:

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 有一些用于检索帧的缓冲区。

您能告诉我如何在每次迭代中获取更新的相机视图吗?

非常感谢

【问题讨论】:

  • 考虑一下,也许低于 opencv 的层可能有超出你控制范围的缓冲区,所以它可能不是那么容易。或许你可以创建一个线程来处理,只在需要时调用cvRetrieveFrame(注意同步问题)和一个定期调用cvGrabFrame的主线程。
  • 很难回答您的问题,因为 OpenCV 可以使用多达 15 种不同的 API 进行视频捕获(详情请参阅 this post)。请发布有关您的操作系统和 OpenCV 版本的更多信息(如果您自己编译了 OpenCV,则您下载了哪些二进制文件或 cmake 输出)。

标签: c++ c opencv


【解决方案1】:

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

http://opencv.jp/opencv-1.0.0_org/docs/ref/opencvref_highgui.htmFMI

话虽如此,但我还是将cvQueryFrame 与典型的网络摄像头配合使用,并且每秒可以轻松获取数十帧。滞后的部分是否真的在您的funcA() 电话中? 编辑:从您代码中的注释中,我看到 funcA() 确实是慢的部分。如果执行需要半秒,您将只能每半秒从cvQUeryFrame 获得一个新帧,正如您所描述的那样。尝试让funcA 更快,或者将其放在单独的线程中。

并且友情提示,cvQueryFrame/cvRetrieveFrame返回的IplImage不应该被用户修改或删除;它是 OpenCV 用于存储东西的内部系统的一部分,如果你用它做任何有趣的事情,你应该复制一份。我不知道你是否已经这样做了,但我刚开始时肯定做错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2017-02-18
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多