Android人臉識別——眼睛是視窗
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imgView=(ImageView)findViewById(R.id.img);
Button btnButton=(Button)findViewById(R.id.btn);
btnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
secondStep(firstStep());
}
});
}
//Step 1. 讀取一張圖片至Bitmap
public Bitmap firstStep()
{
//取圖片並轉為bitmap格式
Bitmap sampleBmp=BitmapFactory.decodeResource(getResources(), R.drawable.img);
//FaceDetecor只能讀取RGB 565格式的Bitmap,所以在開始識別前,我們需要將上面得到的Bitmap進行一次格式轉換。
Bitmap tmpBmp = sampleBmp.copy(Bitmap.Config.RGB_565, true);
return tmpBmp;
}
//Step2. 識別圖片中的人臉,並標識
public void secondStep(Bitmap bitmap)
{
//設定最大可查的人臉數量
int MAX_FACES=5;
FaceDetector faceDet = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), MAX_FACES);
//將人臉資料儲存到facelist中
FaceDetector.Face[] faceList = new FaceDetector.Face[MAX_FACES];
faceDet.findFaces(bitmap, faceList);
// FaceDetector API文件我們發現,它查詢人臉的原理是:找眼睛。
// 它返回的人臉資料face,通過呼叫public float eyesDistance (),public void getMidPoint (PointF point),
// 我們可以得到探測到的兩眼間距,以及兩眼中心點位置(MidPoint)。
// public float confidence () 可以返回該人臉資料的可信度(0~1),這個值越大,該人臉資料的準確度也就越高。
RectF[] faceRects=new RectF[faceList.length];
for (int i=0; i < faceList.length; i++) {
FaceDetector.Face face = faceList[i];
Log.d("FaceDet", "Face ["+face+"]");
if (face != null) {
//confidence標識一個匹配度,在0~1區間,越接近1,表示匹配越高。如果需要可以加上這個判斷條件
//這裡不做判斷
Log.d("FaceDet", "Face ["+i+"] - Confidence ["+face.confidence()+"]");
//獲取兩眼中心點的座標位置
PointF pf = new PointF();
face.getMidPoint(pf);
//這裡的框,引數分別是:左上角的X,Y 右下角的X,Y
//也就是左上角(r.left,r.top),右下角( r.right,r.bottom)。作為定位,確定這個框的格局。
RectF r = new RectF();
r.left = pf.x - face.eyesDistance() / 2;
r.right = pf.x + face.eyesDistance() / 2;
r.top = pf.y - face.eyesDistance() / 2;
r.bottom = pf.y + face.eyesDistance() / 2;
faceRects[i] = r;
//畫框:對原圖進行處理,並在圖上顯示人臉框。
Canvas canvas = new Canvas(bitmap);
Paint p = new Paint();
p.setAntiAlias(true);
p.setStrokeWidth(2);
p.setStyle(Paint.Style.STROKE);
p.setColor(Color.BLUE);
//畫一個圈圈
canvas.drawCircle(r.left, pf.y, 10, p);
canvas.drawCircle(r.right, pf.y, 10, p);
//畫框
canvas.drawRect(r, p);
//圖片顯示
imgView.setImageBitmap(bitmap);
}
}
}
}