我使用OpenCV来检测图像。这是我的问题:我的函数detect_image(mRgba)
需要一些时间来执行操作并给出一些结果。虽然功能是计算相机预览被冻结,因为它只显示代码到达return inputFrame.rgba()
时的图像我想知道如何使这些操作并行,功能将在后台计算,而相机预览正常工作。
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
detect_image(mRgba);
return inputFrame.rgba();
}
答案 0 :(得分:9)
要想尝试并行化,简单的方法就是使用AsyncTask来处理图像:
可以在这里找到更友好的介绍:
http://android-developers.blogspot.co.il/2010/07/multithreading-for-performance.html
虽然:
http://developer.att.com/developer/forward.jsp?passedItemId=11900176
是对Android上多线程的全面介绍。
如果你想要开始使用,一个简单的算法应该是这样的:
使用此算法,如果您的系统在以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 ------------------------------------>
希望这有帮助