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

Mar*_*us0 5 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();
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*k77 10

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

AsyncTask参考页面

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

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帧的新结果的平滑视频,当摄像机预览/显示是I/O密集型时,detect_image是CPU密集型的现实假设.

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

希望这可以帮助