1

「顔検出」のためにAndroidアプリケーションでカメラフィードを処理しているときに問題が発生しました。

私がやろうとしていること:

-surfaceView(UIスレッド)で電話のカメラフィードを継続的に表示するアクティビティがあります

-パフォーマンスの問題を回避するために、OpenCvを使用して検出された面に長方形を描画するためにサーフェスビューを上に配置しました(これはスレッドで実行されています、たとえばthread2)

-直接フィード画像のコピーをThread2に渡して、スレッド2が検出を実行し、オーバーレイサーフェスビューに描画できるようにしようとしています。

私が今いる場所:

-UIthreadがBlockingQueue.add(..)を使用して画像をBlockingQueueに入れ、Thread2がBlockingQで画像を取得して処理し、バックグラウンドで顔を検出できるように、blockingqueueでスレッドを使用することを考えていました

条件: UIスレッドを待たずに、中断されたフィードがディスプレイに表示されるようにします。画像を配置するだけで、他に何も待たずに次のフィードを取得してプロセスを繰り返すことができます。

現在、私はRunnableインターフェイスを実装する新しいクラスを使用しています。このクラスには、blockingQueue.putImage()を使用して画像を配置および取得する2つのメソッドputImage(bitmap)とgetImage()があり、UIthreadによって呼び出され、getImage()はthread2によって呼び出されます。

問題: 画像をブロッキングキューに入れ続けると、Thread2はblockingQ(Itsblocked)にアクセスできず、UIスレッドは中断されずに実行されるはずなので、メインスレッドでwait()またはsleep()を呼び出すことができません。

Thread2がMainThreadをブロックせずにキューからこの画像を取得する方法はありますか?

4

1 に答える 1

3

ここにあるのは、典型的な生産者/消費者問題です。プロデューサーがメインスレッドである必要があります。そして、消費者は顔を検出するものです。別のスレッドで実行する必要があるのはコンシューマーです。キューを処理する個別のスレッドは必要ありません。プロデューサーとコンシューマーがアクセスできる場所であればどこにでも配置できます。
このように、キューが制限されていない限り、ブロッキングは発生しません。デフォルトのLinkedBlockingQueueは実質的に無制限です。
ブロックせずに準備ができた製品にアクセスするには、次のようにします。実行されたタスクの結果を保持する他のキューを宣言します。フェイスプロセッサがプロデューサーになり、メインスレッドがコンシューマーになります。プロセッサにそれを埋めさせ、メインスレッドは定期的に準備ができている製品をチェックします。結果キューが空でないことがわかった場合は、ユーザーに通知するか、必要な操作を行うことができます。

于 2012-08-31T13:10:23.967 に答える