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

时间:2013-04-03 22:38:20

标签: android opencv image-processing

我使用OpenCV来检测图像。这是我的问题:我的函数detect_image(mRgba)需要一些时间来执行操作并给出一些结果。虽然功能是计算相机预览被冻结,因为它只显示代码到达return inputFrame.rgba()时的图像我想知道如何使这些操作并行,功能将在后台计算,而相机预览正常工作。

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
detect_image(mRgba);
return inputFrame.rgba();
}

1 个答案:

答案 0 :(得分:9)

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

AsyncTask reference page

可以在这里找到更友好的介绍:

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

虽然:

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

是对Android上多线程的全面介绍。

如果你想要开始使用,一个简单的算法应该是这样的:

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

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

   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....
                time ------------------------------------>

从HoneyComb开始,更精确的方法是考虑CPU中的核心数量(多核手机/平板电脑变得越来越普遍)并且并行启动N 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 ------------------------------------>

希望这有帮助