1

私はこの単純な機能を得ました

private PointF getFaceCenter(Bitmap faceBitmap){
        PointF faceCenter = new PointF(faceBitmap.getWidth() / 2, faceBitmap.getHeight() / 2);

        Face[] faces = new Face[1];
        mFaceDetector = new FaceDetector(
                faceBitmap.getWidth(), faceBitmap.getHeight(), 1);
        int detected = mFaceDetector.findFaces(faceBitmap, faces);

        if (detected > 0) {
            faces[0].getMidPoint(faceCenter);
        }

        return faceCenter;
    }

私は自分の絵をどこに描くべきかを知ることができるように、顔の中心を得るためにそれを使用します. 再描画中に UI スレッドが常に動かなくなることに気付きました..

だから私はこの計算をに配置しましたonMeasureが、それでもonMeasure呼び出されるたびにUIが遅くなります..

プロファイリングを開始しました:

DDMS プロファイリング

mFaceDetector.findFaces100%のCPU時間がかかるのを見ました!! 顔検出コードを削除したところ、アプリが超高速で動作するようになりました。

私が間違っていることはありますか?

回避策はありますか?

4

1 に答える 1

1

あなたはメインスレッドでそれをやっています。UI イベントを処理するのと同じスレッドです。それがUIブロックの理由です。別のスレッドを使用して計算を実行してみてください。(AsyncTask android ドキュメントを参照)

CPU 使用率については、大量のデータを処理する必要があるため (特に 10MPics カメラを使用している場合:))、正常です。

次の落とし穴は、現在の実装が RGB_565 (これも Android ドキュメント) でのみ機能することです。そのため、ビットマップ構成を確認する価値があるかもしれません。

編集:

Galaxy S3でこれを確認しました-バックカメラで作成された画像の場合、画像の分析に約16秒かかります.

于 2013-07-03T15:42:58.347 に答える