图片来源:Wikipedia javascript
所谓人脸检测就是指从一副图片或者一帧视频中标定出全部人脸的位置和尺寸。人脸检测是人脸识别系统中的一个重要环节,也能够独立应用于视频监控。在数字媒体日益普及的今天,利用人脸检测技术还能够帮助咱们从海量图片数据中快速筛选出包含人脸的图片。 在目前的数码相机中,人脸检测能够用来完成自动对焦,即“脸部对焦”。“脸部对焦”是在自动曝光和自动对焦发明后,二十年来最重要的一次摄影技术革新。家用数码相机,占绝大多数的照片是以人为拍摄主体的,这就要求相机的自动曝光和对焦以人物为基准。 html
via cdstm.cn java
构建一我的脸检测的Android Activity android
你能够构建一个通用的Android Activity,咱们扩展了基类ImageView,成为MyImageView,而咱们须要进行检测的包含人脸的位图文件必须是565格式,API才能正常工做。被检测出来的人脸须要一个置信测度(confidence measure),这个措施定义在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。 ide
最重要的方法实如今setFace(),它将FaceDetector对象实例化,同时调用findFaces,结果存放在faces里,人脸的中点转移到MyImageView。代码以下: this
//百搜技术网:http://www.baisoujs.com
- public class TutorialOnFaceDetect1 extends Activity { private MyImageView mIV;
- private Bitmap mFaceBitmap; private int mFaceWidth = 200;
- private int mFaceHeight = 200; private static final int MAX_FACES = 1;
- private static String TAG = "TutorialOnFaceDetect";
- @Override public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mIV = new MyImageView(this); setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
- // load the photo
- Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3); mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true);
- b.recycle();
- mFaceWidth = mFaceBitmap.getWidth(); mFaceHeight = mFaceBitmap.getHeight();
- mIV.setImageBitmap(mFaceBitmap);
- // perform face detection and set the feature points setFace();
- mIV.invalidate(); }
- public void setFace() {
- FaceDetector fd; FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES];
- PointF midpoint = new PointF(); int [] fpx = null;
- int [] fpy = null; int count = 0;
- try {
- fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES); count = fd.findFaces(mFaceBitmap, faces);
- } catch (Exception e) { Log.e(TAG, "setFace(): " + e.toString());
- return; }
- // check if we detect any faces
- if (count > 0) { fpx = new int[count];
- fpy = new int[count];
- for (int i = 0; i < count; i++) { try {
- faces[i].getMidPoint(midpoint);
- fpx[i] = (int)midpoint.x; fpy[i] = (int)midpoint.y;
- } catch (Exception e) { Log.e(TAG, "setFace(): face " + i + ": " + e.toString());
- } }
- }
- mIV.setDisplayPoints(fpx, fpy, count, 0); }
- }
接下来的代码中,咱们在MyImageView中添加setDisplayPoints() ,用来在被检测出的人脸上标记渲染。图1展现了一个标记在被检测处的人脸上处于中心位置。 spa
- // set up detected face features for display public void setDisplayPoints(int [] xx, int [] yy, int total, int style) {
- mDisplayStyle = style; mPX = null;
- mPY = null;
- if (xx != null && yy != null && total > 0) { mPX = new int[total];
- mPY = new int[total];
- for (int i = 0; i < total; i++) { mPX[i] = xx[i];
- mPY[i] = yy[i]; }
- } }
图1:单一人脸检测 code
多人脸检测 orm
经过FaceDetector能够设定检测到人脸数目的上限。好比设置最多只检测10张脸: 视频
- private static final int MAX_FACES = 10;
图2展现检测到多张人脸的状况。
图2:多人人脸检测
定位眼睛中心位置
Android人脸检测返回其余有用的信息,例同时会返回如eyesDistance,pose,以及confidence。咱们能够经过eyesDistance来定位眼睛的中心位置。
下面的代码中,咱们将setFace()放在doLengthyCalc()中。同时图3展现了定位眼睛中心位置的效果。
- public class TutorialOnFaceDetect extends Activity { private MyImageView mIV;
- &nbs