android人脸识别.doc_第1页
android人脸识别.doc_第2页
android人脸识别.doc_第3页
android人脸识别.doc_第4页
android人脸识别.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在Android实现人脸识别的详细过程发布者:aime达娃他的主页关注的信息收藏的信息推荐的信息参加的群组时间:2012-12-03 00:52:09-照相时,在预览画面上提示用户人脸的位置,并完成自动对焦等,是个错的应用; 下面是实现细节我们知道在android的代码中已有人脸识别的底层算法代码,而且在framework层也封了调用的API函数1. extern/neven 目录下是实现人脸识别的算法代码。2. 添加获取照相时预览图片数据,可以在onPreviewFrame回调函数中得。在开始预览的地方,用mCameraDevice.setPreviewCallback(mPreviewCallback);设置预览回调函数。3.import android.media.FaceDetector;import android.media.FaceDetector.Face;/Harrison add private void DrawRectOnFace() if (numberOfFaceDetected != 0) Face mFace1 = mFace0;PointF midPoint = new PointF(); mFace1.getMidPoint(midPoint);if (Math.abs(mPreMidPoint.x-midPoint.x) 50) & (Math.abs(mPreMidPoint.y-midPoint.y) 50) Log.i(Harrison, not draw Rect .);return ;mPreMidPoint.x = midPoint.x;mPreMidPoint.y = midPoint.y;mFindFaceView.setVisibility(View.VISIBLE); else mPreMidPoint.x = 0;mPreMidPoint.y = 0;mFindFaceView.clearDraw();mFindFaceView.setVisibility(View.GONE);return;mFindFaceView.drawRects(mFace, numberOfFaceDetected);/调用API找人脸,需要import进软件包哦!private void FindFacesInBitmap(Bitmap myBitmap) imageWidth = myBitmap.getWidth();imageHeight = myBitmap.getHeight();Log.i(Harrison, imageWidth=+imageWidth+, imageHeight=+imageHeight);mFace = new FaceDetector.FacenumberOfFace;mFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);numberOfFaceDetected = mFaceDetect.findFaces(myBitmap, mFace);Log.i(Harrison, numberOfFaceDetected=+numberOfFaceDetected);private Bitmap rotateMyBitmap(Bitmap bitmap) int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.postRotate(90); /椤烘椂閽熸棆杞?0搴?Bitmap rotateBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);return rotateBitmap;private Bitmap scaleMyBitmap(Bitmap bitmap) int width = bitmap.getWidth(); int height = bitmap.getHeight(); int nWidth = mFindFaceView.getFaceViewWidth(); int nHeight = mFindFaceView.getFaceViewHeight(); / Log.i(Harrison, nWidth=+nWidth+, nHeight+nHeight);float scaleWidth = (float) nWidth)/width; float scaleHeight = (float)nHeight)/height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);return resizedBitmap;/处理图片格式,一般摄像头抓到的数据为ImageFormat.NV21,不同的格式,需要调整的。private void decodeToBitMap(byte data, android.hardware.Camera _camera) mCameraDevice.setPreviewCallback(null);Size size = mCameraDevice.getParameters().getPreviewSize();/FileOutputStream outStream = null;try YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);if (image != null) ByteArrayOutputStream stream = new ByteArrayOutputStream();pressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);/ outStream = new FileOutputStream(String.format(/sdcard/%d.jpg, System.currentTimeMillis();/ outStream.write(stream.toByteArray();/ outStream.close();/ Log.i(Harrison, write file to sdcard.);/在我的手机上有两种预览模式,发现全屏模式时需要调整图片的大小才能正确定位。Bitmap myBitmap=BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size();stream.close();if (mPreviewLayoutProxy.getFullScreenMode() / fullscreen mode Bitmap tmpScaleBmp=null;Bitmap tmpRotateBmp=null;/手机是竖屏横排是与其别的哦if (mOrientation/90) = 0) | (mOrientation/90) = 2) tmpRotateBmp = rotateMyBitmap(myBitmap);tmpScaleBmp = scaleMyBitmap(tmpRotateBmp);FindFacesInBitmap(tmpScaleBmp);if (tmpRotateBmp != null) tmpRotateBmp.recycle();tmpRotateBmp = null; else FindFacesInBitmap(scaleMyBitmap(myBitmap);if (tmpScaleBmp != null) tmpScaleBmp.recycle();tmpScaleBmp = null; else /normal modeFindFacesInBitmap(myBitmap);DrawRectOnFace();if (myBitmap != null) myBitmap.recycle();myBitmap = null; catch (Exception ex) Log.e(Sys, Error: + ex.getMessage(); mCameraDevice.setPreviewCallback(mPreviewCallback);private final class PostPreviewCallback implements PreviewCallback Overridepublic void onPreviewFrame(byte data, android.hardware.Camera camera) decodeToBitMap(data, camera);我们知道,相机预览是用 SurfaceView来显示图片的;在我们画提示框时,不能直接用那个view的,会出现黑屏的状态,预览的画面也不流畅的。添加一个一样大小的SurfaceView来提示。在xml布局中添加我的画提示框代码:package com.android.camera;import android.content.Context;import android.graphics.Canvas;import android.graphics.Bitmap;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect; import android.graphics.Paint.Style;import android.graphics.PixelFormat;import android.graphics.PorterDuffXfermode;import android.graphics.PorterDuff;import android.util.AttributeSet;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.graphics.PointF;import android.media.FaceDetector;import android.media.FaceDetector.Face;public class FindFaceView extends SurfaceView implements SurfaceHolder.Callbackprotected SurfaceHolder sh;private SurfaceHolder mCameraSh;private int mWidth;private int mHeight;private float mEyesDistance;public FindFaceView(Context context, AttributeSet attrs) super(context, attrs);/ TODO Auto-generated constructor stubsh = getHolder();sh.addCallback(this);sh.setFormat(PixelFormat.TRANSPARENT);setZOrderOnTop(true);public void surfaceChanged(SurfaceHolder arg0, int arg1, int w, int h) / TODO Auto-generated method stubmWidth = w;mHeight = h;public void surfaceCreated(SurfaceHolder arg0) / TODO Auto-generated method stubpublic void surfaceDestroyed(SurfaceHolder arg0) / TODO Auto-generated method stubvoid setCameraPreviewSurfaceHolder(SurfaceHolder sh) mCameraSh = sh;public int getFaceViewWidth() return mWidth;public int getFaceViewHeight() return mHeight;void clearDraw() Canvas canvas = sh.lockCanvas();Paint clipPaint = new Paint();clipPaint.setAntiAlias(true);clipPaint.setStyle(Paint.Style.STROKE);clipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR);canvas.drawPaint(clipPaint);sh.unlockCanvasAndPost(canvas);public void drawRects(FaceDetector.Face mFace, int numberOfFaceDetected) Canvas canvas = sh.lockCanvas();Paint clipPaint = new Paint();clipPaint.setAntiAlias(true);clipPaint.setStyle(Paint.Style.STROKE);clipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR);canvas.drawPaint(clipPaint);canvas.drawColor(Color.TRANSPARENT);Paint p = new Paint();p.setAntiAlias(true);p.setColor(Color.RED);p.setStyle(Style.STROKE);for (int i = 0; i numberOfFaceDetected; i+) / if (0 = i) / p.setColor(Color.WHITE);/ else / p.setColor(Color.GRAY);/ Face face = mFacei;PointF myMidPoint = new PointF();face.getMidPoint(myMidPoint);mEyesDistance = face.eyesDistance();Log.i(Harrison, i=+i+(+myMidPoint.x+, +myMidPoint.y+);canvas.drawRect(int)(myMidPoint.x-mEyesDistance),(int)(myMidPoint.y-mEyesDistance),(int)(myMidPoint.x+mEyesDistance),(int)(myMidPoint.y+mEyesDistance), p);sh.unlockCanvasAndPost(canvas);/测试两个View是否错移public void dr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论