正文
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