1

在处理“面部检测”的 android 应用程序中的相机馈送时,我遇到了一个问题。

我正在尝试做的事情:

-我有一个活动,它在 SurfaceView(UI 线程)中连续显示手机摄像头馈送

- 为了避免性能问题,我在顶部放置了一个表面视图,以使用 OpenCv 在检测到的面上绘制矩形(这是在线程中运行,比如线程 2)

- 我正在尝试将 Direct feed 图像的副本传递给 Thread2,以便线程 2 可以进行检测并在覆盖表面视图上绘图

我现在在哪里:

-我正在考虑使用带有阻塞队列的线程,以便 UIthread 可以使用 BlockingQueue.add(..) 将图像放入 BlockingQueue 中,并且 Thread2 可以在 BlockingQ 中获取图像,对其进行处理并在后台检测人脸

条件: 我希望UI线程,不要等待,以便在显示器上看到统一的提要。它只需要放置图像,然后无需等待其他任何东西,它就可以去获取下一个提要并重复该过程

目前我正在使用一个实现 Runnable 接口的新类,它有两个方法 putImage(bitmap) 和 getImage() 使用blockingQueue.putImage()放置和获取图像由UIthread调用,getImage()由thread2调用

问题: 当我继续将图像放入阻塞队列时,Thread2 无法访问blockingQ(Itsblocked)并且由于UI线程应该不间断地运行,我不能在主线程中调用wait()或sleep()。

Thread2 有什么方法可以在不阻塞 MainThread 的情况下从队列中获取这些图像???

4

1 回答 1

3

你这里有一个典型的生产者-消费者问题。你的生产者应该是主线程。消费者是检测人脸的人。消费者必须在不同的线程中运行。不需要单独的线程来处理队列,它可以在生产者和消费者可以访问的任何地方。
这样,除非您的队列是有界的,否则不应该有任何阻塞。默认的LinkedBlockingQueue实际上是无界的。
要在不阻塞的情况下访问准备好的产品,您可以执行以下操作: 声明另一个队列来保存已完成任务的结果。面部处理器将是它的生产者,主线程将是消费者。让处理器随时填充它,主线程定期检查它是否有准备好的产品。如果它发现结果队列不为空,你可以通知用户或者做任何你想做的事情。

于 2012-08-31T13:10:23.967 回答