-9

カメラからクリックされた写真の体/顔認識に関する情報を示すアイデア/コードを誰かに教えてください。

4

1 に答える 1

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 で機能します。

于 2012-11-05T11:23:50.570 に答える