2013-05-09 16 views
8

Chcę wykryć liczby twarzy w przedniej ramie aparatu. Po wykryciu obrazu mogę wykryć twarz: http://www.developer.com/ws/android/programming/face-detection-with-android-apis.html. Ale nie wiem, jak zrobić zdjęcie za pomocą przedniego aparatu co 30 sekund bez interakcji użytkownika. Czy ktoś może mi pomóc?Wykrywanie twarzy w Androidzie bez interakcji użytkownika

+0

Nie można użyć programu obsługi w następujący sposób: this.refreshTimer = 30 * 1000; this.handlerFaceCapture = new Handler(); this.faceCapture = new FaceCaptureScheduler(); this.handlerFaceCapture .postDelayed (this.handlerFaceCapture, this.refreshTimer); Będzie wykonywał Harmonogram, który musi implementować Runnable w odstępach co 30 sekund. – Gilson

Odpowiedz

4

Poniższy kod będzie rejestrować zdjęcie z aparatu po każdych 5 sekundach.

if (TIMER_STARTED) { 
    multishotTimer.cancel(); 
    multishotTimer.purge(); 
    TIMER_STARTED = false; 
} else { 
    multishotTimer = new Timer(); 
    multishotTimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      TIMER_STARTED = true; 
      Camera camera = surfaceView.getCamera(); 
      camera.takePicture(null, null, 
       new HandlePictureStorage()); 
     } 
    }, 1000, 5000L); 
} 

Tutaj TIMER_STARTED jest logiczna, która wskazuje, czy zegar jest uruchomiony czy nie.

Poniżej kod HandlePictureStorage

private class HandlePictureStorage implements PictureCallback { 
    @Override 
    public void onPictureTaken(byte[] picture, final Camera camera) { 
    //do something when picture is captured... 
    } 
} 
1

Można utworzyć ręcznie do SurfaceView i podglądu kamery na nim następująco:

//First get a reference to the SurfaceView displaying the camera preview 
cameraSurface = (SurfaceView) findViewById(R.id.cameraSurface); 
cameraSurfaceHolder = cameraSurface.getHolder(); 
cameraSurfaceHolder.addCallback(cameraSurfaceHolderCallbacks); 
. 
. 
. 
private SurfaceHolder.Callback cameraSurfaceHolderCallbacks = new SurfaceHolder.Callback() { 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     if(mCamera == null)return; 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     try { 
      mCamera = Camera.open(); 
      mCamera.setPreviewDisplay(holder); 
     } catch (Exception exception) { 
      if(mCamera == null)return; 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     Parameters cameraParameters = mCamera.getParameters(); 
     cameraParameters.setPreviewSize(320, 240); 
     cameraParameters.setPictureSize(320, 240); 
     int avrgExposure = (cameraParameters.getMinExposureCompensation() + cameraParameters.getMaxExposureCompensation())/2; 
     cameraParameters.setExposureCompensation(avrgExposure); 
     mCamera.setParameters(cameraParameters); 
     mCamera.startPreview(); 
     mCamera.takePicture(null, null, mPictureCallback); 
    } 
}; 

Nie zapomnij dodać odpowiednią zgodę kamerę w manifest:

<uses-permission android:name="android.permission.CAMERA"/> 

I wreszcie, jeśli używasz urządzenia z Androidem 4.0 lub powyżej można użyć metody:

mCamera.startFaceDetection(); 
. 
. 
. 
private FaceDetectionListener faceDetectionListener = new FaceDetectionListener() { 

    @Override 
    public void onFaceDetection(Face[] faces, Camera camera) { 
     //Faces have been detected... 
    } 
}; 
. 
. 
. 
mCamera.setFaceDetectionListener(faceDetectionListener); 

Można pójść do tej post który wyjaśnia wszystko związane z tą funkcją, a nawet zapewnia funkcjonalny Android kod źródłowy, który można pobrać, aby zrobić to sam.

Pozdrawiam!

Powiązane problemy