2011-08-13 6 views
2

안녕하세요. 내 얼굴 감지 스레드가 너무 느리게 작동하고 있습니다. 스레드가 작동하지 않는 경우에만 onPreviewFrame에서이 스레드를 호출합니다. 그 밖의 호출은 건너 뜁니다. 스레드가 얼굴을 발견하면 얼굴 안의 onDraw를 호출합니다. 직사각형 그리기느린 얼굴 감지 android

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) return;

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

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

내 질문은 어쩌면 비트 맵으로 작업 중이며 너무 오래 걸리는 회색 계급이 아니기 때문일 수 있습니다. 어떻게 속도를 향상시킬 수 있습니까?

+0

YUV 배열은 우선 루미넌스 데이터가 있으며 그레이 스케일 이미지로 작업 할 수 있습니다. – yeyeyerman

답변

1

FaceDetector API는 실제로 실시간 미리보기에서 프레임을 처리하지 않습니다. 그것은 그것을 위해 느리게하는 방법입니다.

새로운 기기로 실행하는 경우 더 좋은 방법은 Android 14+에서 FaceDetectionListener API를 사용하는 것입니다. 매우 빠르고 SurfaceHolder 미리보기에서 오버레이를 만드는 데 사용할 수 있습니다.

+0

실시간 미리보기에서 프레임 처리를 지원하는 새로운 Android Face detector API도 참조하십시오. https://developers.google.com/vision/ – pm0733464