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) {

如果(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 回答