android人脸检测并裁剪人脸,Android应用开发之Android 裁剪人脸

本文将带你了解Android应用开发之Android 裁剪人脸,希望本文对大家学Android有所帮助。

人脸裁剪类

public final class FaceCj {

private static   BitmapFactory.Options BitmapFactoryOptionsbfo;

private static   ByteArrayOutputStream out;

private static byte[] data;

private static   FaceDetector.Face[] myFace;

private static FaceDetector   myFaceDetect;

private static int tx = 0;

private static int ty = 0;

private static int bx = 0;

private static int by = 0;

private static int width =   0;

private static int height =   0;

private static float wuchax =   0;

private static float wuchay =   0;

private static FaceDetector.Face   face;

private static PointF   myMidPoint;

private static float   myEyesDistance;

private static List   facePaths;

private static String   facePath;

public static Bitmap   cutFace(Bitmap bitmap, Context context) {

facePaths = null;

BitmapFactoryOptionsbfo = new   BitmapFactory.Options();

BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; //   构造位图生成的参数,必须为565。类名+enum

out = new   ByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);

data =   out.toByteArray();

bitmap =   BitmapFactory.decodeByteArray(data, 0, data.length,

BitmapFactoryOptionsbfo);

try {

out.flush();

out.close();

} catch (IOException e)   {

// TODO Auto-generated   catch block

e.printStackTrace();

}

width =   bitmap.getWidth();

height =   bitmap.getHeight();

myFace = new   FaceDetector.Face[5]; // 分配人脸数组空间

myFaceDetect = new   FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 5);

int numberOfFaceDetected =   myFaceDetect.findFaces(bitmap, myFace);

if (numberOfFaceDetected   <= 0) {// FaceDetector构造实例并解析人脸

bitmap.recycle();

return null;

}

facePaths = new   ArrayList();

for (int i = 0; i <   numberOfFaceDetected; i++) {

face = myFace[i];

myMidPoint = new   PointF();

face.getMidPoint(myMidPoint);

myEyesDistance =   face.eyesDistance();     //得到人脸中心点和眼间距离参数,并对每个人脸进行画框

wuchax = myEyesDistance /   2 + myEyesDistance;

wuchay = myEyesDistance *   2 / 3 + myEyesDistance;

if (myMidPoint.x - wuchax   < 0) {//判断左边是否出界

tx = 0;

} else {

tx = (int)   (myMidPoint.x - wuchax);

}

if (myMidPoint.x + wuchax   > width) {//判断右边是否出界

bx = width;

} else {

bx = (int)   (myMidPoint.x + wuchax);

}

if (myMidPoint.y - wuchay   < 0) {//判断上边是否出界

ty = 0;

} else {

ty = (int)   (myMidPoint.y - wuchay);

}

if (myMidPoint.y + wuchay   > height) {//判断下边是否出界

by = height;

} else {

by = (int)   (myMidPoint.y + wuchay);

}

try {

return   Bitmap.createBitmap(bitmap, tx, ty, bx - tx, by - ty);//这里可以自行调整裁剪宽高

} catch (Exception e)   {

e.printStackTrace();

}

}

bitmap.recycle();

return bitmap;

}

}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值