3

こんにちは、顔検出スレッドの動作が遅すぎます。スレッドが動作していない場合にのみ onPreviewFrame からこのスレッドを呼び出します。それ以外の場合は呼び出しをスキップし、スレッドが顔を検出した後、ビュー内で onDraw を呼び出して四角形を描画します

    public void run() {
        FaceDetector faceDetector = new FaceDetector(bitmapImg.getWidth(), bitmapImg.getHeight(), 1);
        numOfFacesDetected = faceDetector.findFaces(bitmapImg, detectedFaces);

        if (numOfFacesDetected != 0) {
            detectedFaces.getMidPoint(eyesMidPoint);
            eyesDistance = detectedFaces.eyesDistance();

            handler.post(new Runnable() {
                public void run() {
                    mPrev.invalidate();
                    // turn off thread lock
                }
            });

            mPrev.setEyesDistance(eyesDistance);
            mPrev.setEyesMidPoint(eyesMidPoint);
        }

        isThreadWorking = false;
    }


public void onPreviewFrame(byte[] yuv, Camera camera) {

if (isThreadWorking) 戻ります。

    isThreadWorking = true;
    ByteBuffer bbuffer = ByteBuffer.wrap(yuv);
    bbuffer.get(grayBuff_, 0, bufflen_);

    detectThread = new FaceDetectThread(handler);
    detectThread.setBuffer(grayBuff_);
    detectThread.start();

私の質問は、グレースケールではなくビットマップで作業しているため、時間がかかりすぎている可能性がありますか? どうすれば速度を改善できますか?

4

1 に答える 1

1

FaceDetector API は、実際にはライブ プレビューでフレームを処理するようには作られていません。そのために遅くする方法です。

かなり新しいデバイスで実行している場合は、Android 14 以降でFaceDetectionListener API を使用することをお勧めします。これは非常に高速で、プレビュー SurfaceHolder にオーバーレイを作成するために使用できます。

于 2012-08-01T18:21:47.733 に答える