【问题标题】:Parallel image detection and camera preview OpenCV Android并行图像检测和相机预览 OpenCV Android
【发布时间】:2014-01-22 06:33:55
【问题描述】:

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

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

【问题讨论】:

    标签: android opencv image-processing


    【解决方案1】:

    为了体验并行化,简单的方法是只使用 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 并返回
    • 如果答案是“否”,则启动一个新的 AsyncThread 并让它在 mRgba 上运行“detectImage”,确保结果保存在 onPostExecute 方法中。

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

    捕获:x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.... 处理:1.......1........1.......1......1........1.... 时间------------------------------------>

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

    如果您通过固定延迟(大约为 detectImage/N 的持续时间)将每个线程分开,您应该得到一个恒定的结果流,其频率应该是单线程版本的倍数。

    捕获:x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.... 处理:1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4.... 时间------------------------------------>

    希望对你有帮助

    【讨论】:

    • 我想我明白了,除了关于“以固定延迟分隔每个线程”的部分。如果内核可以并行处理,为什么会有帮助?我想我错过了这种操作的一些基本内容。无论如何,您将如何将每个线程分开一个固定的延迟?一旦你启动一个线程,它就会运行不是吗,不管它是什么时候相对于其他线程产生的?
    • 总的想法(我们在这里讨论的是概念,因为我自己没有测试设置)是获得均匀分离的帧作为输出。如我所述,将前 N 帧馈送到您的 N 个核心而不延迟它们会给您相同的帧速率(或稍微好一点的帧速率,因为它的价值),但图像将被处理并显示为 N 图像的“突发” ,中间有很大的停顿,观众仍然会认为结果非常生涩。希望这会有所帮助。
    • 确实如此。谢谢。我在想 N 帧的处理应该与事情的平滑程度无关,因为它们不在主线程上,主线程上的逻辑将负责以平滑的方式绘制事物,但现在似乎很清楚所有主线程可以做的就是随遇而安。它不知道如何以减轻时间不均的方式绘制帧。
    • 不仅如此,即使 UI 线程可以按设定的间隔呈现帧,用户也不会注意到;帧本身将源于一个非常短的间隔(如果检测图像需要 1 秒,则为 4 个内核的 0.066),可能存在难以察觉的差异:在 1/4 秒内播放 4 个几乎相同的帧并不能大大提高平滑度......
    猜你喜欢
    • 2017-02-11
    • 2013-01-26
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多