2012-11-05 5 views

답변

3

희망이 당신을 도울 수 있기를 바랍니다.

package com.detectcamera; 
    import java.io.FileNotFoundException; 
    import java.io.IOException; 
    import java.io.OutputStream; 

    import android.app.Activity; 
    import android.content.ContentValues; 
    import android.content.pm.ActivityInfo; 
    import android.graphics.Canvas; 
    import android.graphics.Matrix; 
    import android.graphics.Paint; 
    import android.graphics.PixelFormat; 
    import android.graphics.RectF; 
    import android.hardware.Camera; 
    import android.hardware.Camera.AutoFocusCallback; 
    import android.hardware.Camera.Face; 
    import android.hardware.Camera.FaceDetectionListener; 
    import android.hardware.Camera.PictureCallback; 
    import android.hardware.Camera.ShutterCallback; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.provider.MediaStore.Images.Media; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.Menu; 
    import android.view.SurfaceHolder; 
    import android.view.SurfaceView; 
    import android.view.View; 
    import android.view.ViewGroup.LayoutParams; 
    import android.widget.Button; 
    import android.widget.LinearLayout; 
    import android.widget.TextView; 


    public class MainActivity extends Activity implements SurfaceHolder.Callback { 

Camera camera; 
SurfaceView surfaceView; 
SurfaceHolder surfaceHolder; 
boolean previewing = false; 
LayoutInflater controlInflater = null; 

Button buttonTakePicture; 
TextView prompt; 
final int RESULT_SAVEIMAGE = 0; 
    Paint paint = new Paint(); 
    // List<Camera.Face> faces = new ArrayList<Camera.Face>(); 
Matrix matrix = new Matrix(); 
RectF rect = new RectF(); 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    getWindow().setFormat(PixelFormat.UNKNOWN); 
    surfaceView = (SurfaceView) findViewById(R.id.camerapreview); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    controlInflater = LayoutInflater.from(getBaseContext()); 
    View viewControl = controlInflater.inflate(R.layout.control, null); 
    LayoutParams layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    this.addContentView(viewControl, layoutParamsControl); 

    buttonTakePicture = (Button) findViewById(R.id.takepicture); 
    buttonTakePicture.setOnClickListener(new Button.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      camera.takePicture(myShutterCallback, myPictureCallback_RAW, 
        myPictureCallback_JPG); 
     } 
    }); 

    LinearLayout layoutBackground = (LinearLayout) findViewById(R.id.background); 
    layoutBackground.setOnClickListener(new LinearLayout.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 

      buttonTakePicture.setEnabled(false); 
      camera.autoFocus(myAutoFocusCallback); 
     } 
    }); 

    prompt = (TextView) findViewById(R.id.prompt); 
} 

FaceDetectionListener faceDetectionListener = new FaceDetectionListener() { 

    @Override 
    public void onFaceDetection(Face[] faces, Camera camera) { 

     Canvas canvas = new Canvas(); 
     rect.set(faces[0].rect); 
      // dumpRect(rect, "before"); 
      matrix.mapRect(rect); 
     // dumpRect(rect, "after"); 
      canvas.drawRect(rect, paint); 

     if (faces.length == 0) { 
      prompt.setText(" No Face Detected! "); 
     } else { 
      prompt.setText(String.valueOf(faces.length) 
        + " Face Detected :) "); 

     } 

    } 
}; 

AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback() { 

    @Override 
    public void onAutoFocus(boolean arg0, Camera arg1) { 
     // TODO Auto-generated method stub 
     buttonTakePicture.setEnabled(true); 
    } 
}; 

ShutterCallback myShutterCallback = new ShutterCallback() { 

    @Override 
    public void onShutter() { 
     // TODO Auto-generated method stub 

    } 
}; 

PictureCallback myPictureCallback_RAW = new PictureCallback() { 

    @Override 
    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 

    } 
}; 

PictureCallback myPictureCallback_JPG = new PictureCallback() { 

    @Override 
    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 
     /* 
     * Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, 
     * arg0.length); 
     */ 

     Uri uriTarget = getContentResolver().insert(
       Media.EXTERNAL_CONTENT_URI, new ContentValues()); 

     OutputStream imageFileOS; 
     try { 
      imageFileOS = getContentResolver().openOutputStream(uriTarget); 
      imageFileOS.write(arg0); 
      imageFileOS.flush(); 
      imageFileOS.close(); 

      prompt.setText("Image saved: " + uriTarget.toString()); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     camera.startPreview(); 
     Log.v("MainActivity","start camera preview.........................."); 
     camera.startFaceDetection(); 
    } 
}; 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { 
    // TODO Auto-generated method stub 
      if(previewing){ 
      camera.stopFaceDetection(); 
      camera.stopPreview(); 
      previewing = false; 
      } 

      if (camera != null){ 
      try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 

      prompt.setText(String.valueOf(
       "Max Face: " + camera.getParameters().getMaxNumDetectedFaces())); 
      camera.startFaceDetection(); 
      previewing = true; 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
      } 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

    camera = Camera.open(); 
    camera.setFaceDetectionListener(faceDetectionListener); 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    camera.stopFaceDetection(); 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
     previewing = false; 

} 

이것은 ICS 이상 API에서 작동합니다.

+0

더 나은 대답을 얻을 수 있도록 다운로드 코드에 대한 링크를 제공하십시오 .. –

+3

해킹 할 @nil_born : 그는 심지어 당신에게 몇 가지 코드를 제공하고 자신을 위해 나머지를 파악해 주셔서 행복해야합니다. – Carnal

+0

얼굴 검색을 수행하는 방법은 다양합니다. 1. NDK 사용 2. OpenCV 사용 3. 안드로이드의 API 사용. – Sharmilee