摄像头捕捉头部动作

来源:互联网 发布:单片机实验箱 编辑:程序博客网 时间:2024/06/10 21:53

CameraGameActivity摄像头捕捉头部动作及脸部识别

public class CameraGameActivity extends Activity
{
    /** Called when the activity is first created. */
    TextView textView;


    Bitmap face;


    MyImage imageView;


    int count;


    SurfaceView surfaceView;


    SurfaceHolder surfaceHolder;


    Bitmap image = null;


    // 定义系统所用的照相机
    Camera camera;


    // 是否在浏览中
    boolean isPreview = false;


    // 人脸识别
    FaceDetector faceDetector = null;


    FaceDetector.Face[] faces = null;


    PointF minPointF = new PointF();


    float[] x = null;


    float[] y = null;


    PreviewCallback previewCallback = new PreviewCallback()
    {


        @Override
        public void onPreviewFrame(byte[] data, Camera camera)
        {
            // 传递进来的data,默认是YUV420SP的
            if (data != null)
            {
                Camera.Parameters parameters = camera.getParameters();
                int imageFormat = parameters.getPreviewFormat();
                // Log.i("map", "Image Format: " + imageFormat);


                if (imageFormat == ImageFormat.NV21)
                {
                    // get full picture
                    int w = parameters.getPreviewSize().width;
                    int h = parameters.getPreviewSize().height;


                    Rect rect = new Rect(0, 0, w, h);
                    YuvImage img = new YuvImage(data, ImageFormat.NV21, w, h, null);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    if (img.compressToJpeg(rect, 100, baos))
                    {
                        image = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.size());


                        // saveBitmap2file(image,"face.jpg");
                        face = image.copy(Config.RGB_565, true);
                        image.recycle();


                        setFace(face);
                    }
                }
            }
        }
    };


    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        textView = (TextView) findViewById(R.id.textView1);
        imageView = (MyImage) findViewById(R.id.imageView1);
        // 获取界面中SurfaceView组件
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
        // 获取surfaceView中的SurfaceHolder
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new Callback()
        {


            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
            {
                // TODO Auto-generated method stub
            }


            public void surfaceCreated(SurfaceHolder holder)
            {
                // TODO Auto-generated method stub
                initCamera();
                setSurfaceViewSize();
                initFaceDetector();
            }


            public void surfaceDestroyed(SurfaceHolder holder)
            {
                // TODO Auto-generated method stub
                // 如果camera不为null,释放摄像头
                if (camera != null)
                {
                    if (isPreview)
                    {
                        camera.setPreviewCallback(null);
                        camera.stopPreview();
                    }
                    isPreview = false;
                    camera.release();
                    camera = null;
                }
            }


        });


    }


    private void initCamera()
    {
        if (camera == null && !isPreview)
        {

camera = Camera.open();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
   for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
    CameraInfo info = new CameraInfo();
    Camera.getCameraInfo(i, info);
    if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {//这就是前置摄像头,亲。
     camera  = Camera.open(i);
    }
   }
  }


            // 打开照相机
 //           if (Camera.getNumberOfCameras() > 1)
//            {
                //前置摄像头
//                camera = Camera.open(1);
//            }
 //           else
 //           {
//                camera = Camera.open();
//            }


            camera.setPreviewCallback(previewCallback);


        }
        if (camera != null && !isPreview)
        {
            try
            {
                Camera.Parameters parameters = camera.getParameters();


                List<Size> sizes = parameters.getSupportedPreviewSizes();
                int height = 10000;
                int width = 10000;
                for (Size size : sizes)
                {
                    if (height > size.height)
                    {
                        height = size.height;
                        width = size.width;
                    }
                }


                // 设置照片预览的大小
                parameters.setPreviewSize(width, height);
                // 每秒显示8帧
                parameters.setPreviewFrameRate(8);
                // 设置图片格式
                parameters.setPictureFormat(PixelFormat.JPEG);
                // 设置JPEG照片的质量
                parameters.set("jpeg-quality", 85);


                // 设置照片的大小
                // parmeters.setPictureSize(WIDTH, HEIGHT);
                camera.setParameters(parameters);
                // 通过surfaceView来显示取景画面
                camera.setPreviewDisplay(surfaceHolder);
                // 开始预览
                camera.startPreview();
                isPreview = true;


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


    }
    
    public void setSurfaceViewSize()
    {
        LayoutParams layoutParams = surfaceView.getLayoutParams();
        layoutParams.height =  camera.getParameters().getPreviewSize().height;
        layoutParams.width = camera.getParameters().getPreviewSize().width;
        surfaceView.setLayoutParams(layoutParams);
        imageView.setLayoutParams(layoutParams);
    }
    
    public void initFaceDetector()
    {
        faceDetector = new FaceDetector(camera.getParameters().getPreviewSize().width,
            camera.getParameters().getPreviewSize().height, 10);
        faces = new FaceDetector.Face[10];
    }


    public void setFace(Bitmap bitmap)
    {
        Long time = System.currentTimeMillis();
        count = faceDetector.findFaces(bitmap, faces);
        Log.d("gc", "-----------count : " + count);
        x = new float[count];
        y = new float[count];
        if (count > 0)
        {
            faces[0].getMidPoint(minPointF);
            x[0] = minPointF.x;
            y[0] = minPointF.y;
            imageView.setPoint(x[0], y[0]);
            textView.setText(getResources().getString(R.string.help) + " x = " + x[0] + " y = " + y[0]);
            textView.invalidate();
        }


        Log.d("gc", "time--------------" + (System.currentTimeMillis() - time));
        imageView.invalidate();


    }


    static boolean saveBitmap2file(Bitmap bmp, String filename)
    {
        CompressFormat format = Bitmap.CompressFormat.JPEG;
        int quality = 100;
        OutputStream stream = null;
        try
        {
            File file = new File(Environment.getExternalStorageDirectory() + "/" + filename);
            if (!file.exists())
            {
                file.createNewFile();
            }


            stream = new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + filename);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return bmp.compress(format, quality, stream);
    }
}


脸部周围画框

public class MyImage extends ImageView
{
    Paint paint;
    float  x ;
    float  y ;
    public MyImage(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }


    public MyImage(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
    }


    public MyImage(Context context)
    {
        super(context);
        init();
    }
    
    public void init()
    {
        paint = new Paint();
        paint.setStrokeWidth(3);//线条粗细
        paint.setColor(Color.BLUE);
        paint.setStyle(Style.STROKE);
    }
    
    public void setPoint(float x, float y)
    {
        this.x = getWidth() - x;
        this.y = y;
    }
    
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        if(x!= 0 && y != 0)
        {
            canvas.drawRect(x-30, y-30, x+30, y+30, paint);
        }
    }
}