OpenCV:处理每一帧
我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获。在所有示例中,我发现来自相机的帧是使用抓取功能进行处理并等待一段时间。我想处理序列中的每一帧。我想定义我自己的回调函数,每次当一个新帧准备好处理时都会执行该函数(就像在 Windows 的 directshow 中,当您定义并放入您自己的过滤器时)用于此类目的)。
所以问题是:我该怎么做?
I want to write a cross-platform application using OpenCV for video capture. In all the examples, i've found frames from the camera are processed using the grab function and waiting for a while. And i want to process every frame in a sequence. I want to define my own callback function, which will be executed every time, when a new frame is ready to be processed (like in directshow for Windows, when you defining and putting into the graph your own filter for such purposes).
So the question is: how can i do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据下面的代码,所有回调都必须遵循此定义:
此签名意味着回调将在系统检索到的每个帧上执行。在我的示例中, make_it_gray() 分配一个新图像来保存灰度转换的结果并返回它。这意味着您必须稍后在代码中释放该框架。我在代码中添加了有关它的注释。
请注意,如果您的回调需要大量处理,系统可能会跳过相机中的几帧。考虑一下 Paul R 和 diverscuba23 提出的建议。
编辑:
我更改了上面的代码,以便它打印当前帧速率并执行手动灰度转换。它们是对代码的小调整,我这样做是为了教育目的,这样人们就知道如何在像素级别执行操作。
According to the code below, all callbacks would have to follow this definition:
This signature means the callback is going to be executed on each frame retrieved by the system. On my example, make_it_gray() allocates a new image to save the result of the grayscale conversion and returns it. This means you must free this frame later on your code. I added comments on the code about it.
Note that if your callback demands a lot of processing, the system might skip a few frames from the camera. Consider the suggestions Paul R and diverscuba23 did.
EDIT:
I changed the code above so it prints the current framerate and performs a manual grayscale conversion. They are small tweaks on the code and I did it for education purposes so one knows how to perform operations at pixel level.
快速的想法是有两个线程,第一个线程负责抓取帧并在它们可用时通知第二个线程(将它们放入处理队列中),第二个线程以事件循环类型的方式完成所有处理。
请参阅 boost::thread 和 boost::signals2 ,因为这两个一起应该为我上面描述的提供大部分框架(队列除外)。
Quick thoughts would be to have 2 threads, the first thread is responsible for grabbing the frames and notifiy the second thread when they are available (places them in a processing queue), the second thread does all your processing in an event loop type manner.
See boost::thread and boost::signals2 as those two together should provide most of the framework (except for the queue) for what I described above.