专栏名称: 复利大王
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
复利大王  ·  黄小姐又来搞事情? ·  6 小时前  
复利大王  ·  六年级已成早恋重灾区了? ·  6 小时前  
鸿洋  ·  今年这形势,千万别离职! ·  昨天  
复利大王  ·  大瓜!124名医生涉嫌受贿被曝光 ·  昨天  
51好读  ›  专栏  ›  复利大王

Android高科技之人脸检测详解

复利大王  · 公众号  · android  · 2017-02-17 12:25

正文

请到「今天看啥」查看全文


private FaceOverlayView mFaceOverlayView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super .onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mFaceOverlayView = (FaceOverlayView) findViewById( R.id.face_ overlay );

InputStream stream = getResources().openRawResource( R.raw.face );

Bitmap bitmap = BitmapFactory.decodeStream(stream);

mFaceOverlayView.setBitmap(bitmap);

}

}


2、检测人脸


现在你的工程已经设置好了,是时候来开始检测人脸了。在setBitmap( Bitmap bitmap )方法中定义一个FaceDetector对象。我们可以通过用FaceDetector中的构造器来实现,通过FaceDetector.Builder你可以定义多个参数来控制人脸检测的速度和FaceDetector生成的其他数据。


具体的设置取决于你的应用程序的用途。如果开启了面部特征搜索,那么人脸检测的速度回变得很慢。在大多数程序设计中,每一件事都有它的优缺点。如果想要了解关于FaceDetector.Builder的更多信息,你可以通过查找安卓开发者网站的官网文档获得。


FaceDetector detector = new FaceDetector.Builder( getContext() )

.setTrackingEnabled( false )

.setLandmarkType(FaceDetector.ALL_LANDMARKS)

.setMode(FaceDetector.FAST_MODE)

.build();


你需要检查FaceDetector是否是可操作的。每当用户第一次在设备上使用人脸检测,Play Services服务需要加载一组小型本地库去处理应用程序的请求。虽然这些工作一般在应用程序启动之前就完成了,但是做好失败处理同样是必要的。


如果FaceDetector是可操作的,那么你需要将位图数据转化成Frame对象,并通过detect函数传入用来做人脸数据分析。当完成数据分析后,你需要释放探测器,防止内存泄露。最后调用invalidate()函数来触发视图刷新。


if (!detector.isOperational()) {

//Handle contingency

} else {

Frame frame = new Frame.Builder().setBitmap(bitmap).build();

mFaces = detector.detect(frame);

detector.release();

}

invalidate();


现在你已经在图片中发现了人脸信息,并可以使用了。例如,你可以沿着检测出的每一张脸画一个框。在invalidate()函数调用之后,我们可以在OnDraw(Canvas canvas)函数中添加所有必要的逻辑。我们需要确保位图和人脸数据是有效的,在那之后画布上画出位图数据,然后再沿着每张脸的方位画一个框。


因为不同的设备的分辨率不同,你需要通过控制位图的缩放尺寸来保证图片总是能被正确显示出来。


@Override

protected void onDraw(Canvas canvas) {

super .onDraw(canvas);

if ((mBitmap != null ) && (mFaces != null )) {

double scale = drawBitmap(canvas);

drawFaceBox(canvas, scale);

}

}


drawBitmap(Canvas canvas)方法会将图像自适应大小的画在画布上,同时返回一个正确的缩放值供你使用。


private double drawBitmap( Canvas canvas ) {

double viewWidth = canvas.getWidth();

double viewHeight = canvas.getHeight();

double imageWidth







请到「今天看啥」查看全文