我在android应用程序中处理摄像头以进行“人脸检测”时遇到了一个问题。
我想做的事:
-I有一个在surfaceView(UI线程)中连续显示手机摄像头馈送的活动。
-To避免了性能问题,我在顶部放置了一个表面视图,以便使用OpenCv在检测到的人脸上绘制矩形(thread2说,这是在线程中运行的)。
-I正在尝试将直接提要图像的副本传递给Thread2,以便线程2可以进行检测并在覆盖面视图上绘制
我现在所处的位置:
-I正在考虑使用带有阻塞队列的线程,以便UIthread可以使用BlockingQueue.add(.)将图像放入blockingqueueThread2可以对BlockingQ中的图像进行处理,在背景中检测人脸。
条件:我想要UI线程,而不是等待,这样在display.It上就可以看到未迭代的提要,只需要放置图像,然后不等待任何东西,它就可以去获取下一个提要,然后重复处理。
目前,我正在使用一个实现Runnable接口的新类,它有两个方法:putImage(位图)和getImage() (使用blockingQueue.putImage() ),UIthread调用blockingQueue.putImage(),thread2调用getImage()
问题:当我继续将图像放到阻塞队列中时,Thread2无法访问blockingQ(Itsblocked),而且由于UI线程应该不间断地运行,所以我不能在主线程中调用wait()或wait()。
Thread2是否可以在不阻塞MainThread的情况下从队列中获取图像?
发布于 2012-08-31 13:10:23
这里有一个典型的生产者-消费者问题。你的制片人应该是主线。消费者是检测脸部的人。必须在另一个线程中运行的是使用者。不需要单独的线程来处理队列,它可以位于生产者和使用者可以访问的任何地方。
这样就不应该有任何阻塞,除非您的队列是有界的。默认的LinkedBlockingQueue实际上是无界的。
要在不阻塞的情况下访问就绪产品,可以执行以下操作:声明另一个队列,该队列将保存已完成任务的结果。脸处理器将是它的生产者和主线程将是消费者。让处理器一边填充,一边让主线程定期检查它是否有现成的产品。如果发现结果队列不是空的,则可以通知用户或做任何您想做的事情。
https://stackoverflow.com/questions/12215702
复制相似问题