android 人脸识别 摄像头采集
时间: 2023-10-06 18:05:08 浏览: 50
实现Android人脸识别需要用到Android系统自带的FaceDetector类。具体步骤如下:
1.获取摄像头对象。
2.设置预览界面,并启动预览。
3.在预览界面的SurfaceView上获取画布,并将预览界面的图像绘制到画布上。
4.通过FaceDetector类检测人脸,并获取人脸的坐标和数量。
5.根据人脸坐标在预览界面上绘制人脸框。
下面是一份简单的代码实现:
```java
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback {
private SurfaceView mPreview;
private SurfaceHolder mHolder;
private Camera mCamera;
private byte[] mBuffer;
private FaceDetector mFaceDetector;
private Face[] mFaces;
private Paint mPaint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPreview = findViewById(R.id.preview);
mHolder = mPreview.getHolder();
mHolder.addCallback(this);
mFaceDetector = new FaceDetector(320, 240, 1);
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = mCamera.getParameters();
Camera.Size size = parameters.getPreviewSize();
int bufferSize = size.width * size.height * ImageFormat.getBitsPerPixel(parameters.getPreviewFormat()) / 8;
mBuffer = new byte[bufferSize];
mCamera.addCallbackBuffer(mBuffer);
mCamera.setPreviewCallbackWithBuffer(this);
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = parameters.getPreviewSize();
YuvImage yuvImage = new YuvImage(data, parameters.getPreviewFormat(), size.width, size.height, null);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, size.width, size.height), 100, outputStream);
byte[] jpegData = outputStream.toByteArray();
Bitmap bmp = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length);
mFaces = new Face[1];
mFaceDetector.findFaces(bmp, mFaces);
Canvas canvas = mHolder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
if (mFaces.length > 0) {
Face face = mFaces[0];
float left = face.rect.left;
float top = face.rect.top;
float right = face.rect.right;
float bottom = face.rect.bottom;
canvas.drawRect(left, top, right, bottom, mPaint);
}
mHolder.unlockCanvasAndPost(canvas);
camera.addCallbackBuffer(mBuffer);
}
}
```
在这个例子中,我们使用SurfaceView来预览摄像头采集到的图像,然后在画布上绘制人脸框。注意,这个例子只识别一张人脸。如果需要识别多张人脸,需要修改代码。