并行图像检测和相机预览 OpenCV Android

5
我正在使用OpenCV来检测一张图片。这是我的问题:我的函数detect_image(mRgba)需要一些时间来执行操作并给出一些结果。当函数正在计算时,相机预览会被冻结,因为它只在代码达到return inputFrame.rgba()时显示图像。我想知道如何使这些操作并行,函数将在后台计算,而相机预览将以正常速度工作。
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
detect_image(mRgba);
return inputFrame.rgba();
}
1个回答

10

要尝试并行处理,简单的方法是使用AsyncTask来处理图像:

AsyncTask参考页面

这里有一个更友好的介绍:

http://android-developers.blogspot.co.il/2010/07/multithreading-for-performance.html

而这个链接则是关于在Android上进行多线程的很好的综合介绍:

http://developer.att.com/developer/forward.jsp?passedItemId=11900176

如果你想开始尝试,一个简单的算法可能会像这样:

  • 从“onCameraFrame”方法内部检查是否已经有用于处理图像的AsyncThread在运行。
  • 如果答案为“是”,则只需在预览窗口中显示mRgba并返回。
  • 如果答案为“否”,则启动一个新的AsyncThread,并让它在mRgba上运行“detectImage”,确保结果在onPostExecute方法中保存。

使用此算法,如果您的系统能够在以60fps取景的同时检测到每秒4张图像(例如),则在单个处理器设备上,基于detect_image是CPU密集型而相机预览/显示为I/O密集型的现实假设下,您将能够获得一个平滑的视频,每20-30帧有一个新结果。

   Capture:     x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x....
   Processing:  1.......1.......1.......1.....1.......1....
                时间 ------------------------------------>

从HoneyComb开始,更精细的方法是考虑您的CPU中的核心数(多核手机/平板电脑越来越普遍),并同时启动N个AsyncTask(每个核心一个),向每个AsyncTask提供不同的预览图像(可能使用线程池...)。

如果您按固定延迟(大约为detectImage/N的持续时间)分离每个线程,那么您应该会得到一个连续的结果流,其频率应该是单线程版本的倍数。

   Capture:     x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x....
   Processing:  1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4....
                time ------------------------------------>

希望这可以帮助您。


我认为我理解了,除了“通过固定延迟分离每个线程”这部分。如果内核可以并行处理,为什么这会有所帮助?我想我在这种操作中缺少一些基本的东西。你怎样才能按固定的延迟分离每个线程呢?一旦启动了一个线程,它就会运行,不管它是何时被生成与其他线程相比。 - Alyoshak
总的想法(我们在这里谈论概念,因为我自己没有测试过设置)是获得均匀分隔的帧作为输出。如果将前N帧馈送到您的N个核心而不延迟它们,就会给您相同的帧速率(或者略微更好,如果值得的话),但图像将以N个图像的“突发”方式进行处理和显示,在它们之间有很大的暂停,观众仍然会感觉结果非常卡顿。希望这可以帮助到您。 - Rick77
可以的。谢谢。我曾认为处理N帧与事物看起来流畅无关,因为它们不在主线程上,而主线程上的逻辑将负责以平滑的方式绘制事物,但现在似乎很清楚,所有主线程能做的就是按照它们的顺序接收事物。它无法知道如何以减轻不均匀时间的方式绘制帧。 - Alyoshak
即使UI线程能够按照设定的间隔呈现帧,用户也不会注意到;帧本身来自非常短的时间间隔(例如如果detectimage需要1秒,则4个核心的时间间隔为0.066),可能存在几乎无法察觉的差异:在1/4秒内播放4个几乎相同的帧并不能显著提高平滑度... - Rick77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接