gpt4 book ai didi

java - 如何使用阻塞队列在后台处理摄像头源?

转载 作者:行者123 更新时间:2023-12-02 07:36:01 25 4
gpt4 key购买 nike

我在 Android 应用程序中处理“人脸检测”的相机提要时遇到了问题。

我正在尝试做什么:

-我有一个在 SurfaceView(UI 线程)中连续显示手机摄像头源的 Activity

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

-我试图将直接馈送图像的副本传递给线程2,以便线程2可以进行检测并在覆盖表面 View 上绘制

我现在在哪里:

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

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

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

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

有什么方法可以让线程2从队列中获取这些图像而不阻塞主线程???

最佳答案

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

关于java - 如何使用阻塞队列在后台处理摄像头源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com