Android--- 教你如何用三十分钟在安卓上开发一个微笑抓拍神器
2、代码开发
2.1 创建人脸分析器,检测到微笑后进行拍照
检测后拍照:
进行分析器参数配置
把分析器参数配置传给分析器
在 analyzer.setTransacto 内通过重写 transactResult 处理人脸识别后的内容,人脸识别后会返回一个微笑的置信度(简单可以理解为是微笑的概率),只要设置大于一定置信度进行拍照就可以了。
private MLFaceAnalyzer analyzer;private void createFaceAnalyzer() {MLFaceAnalyzerSetting setting =new MLFaceAnalyzerSetting.Factory().setFeatureType(MLFaceAnalyzerSetting.TYPE_FEATURES).setKeyPointType(MLFaceAnalyzerSetting.TYPE_UNSUPPORT_KEYPOINTS).setMinFaceProportion(0.1f).setTracingAllowed(true).create();
this.analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer(setting);this.analyzer.setTransactor(new MLAnalyzer.MLTransactor<MLFace>() {@Override public void destroy() {}
@Override public void transactResult(MLAnalyzer.Result<MLFace> result) {SparseArray<MLFace> faceSparseArray = result.getAnalyseList();int flag = 0;for (int i = 0; i < faceSparseArray.size(); i++) {MLFaceEmotion emotion = faceSparseArray.valueAt(i).getEmotions();if (emotion.getSmilingProbability() > smilingPossibility) {flag++;}}if (flag > faceSparseArray.size() * smilingRate && safeToTakePicture) {safeToTakePicture = false;mHandler.sendEmptyMessage(TAKE_PHOTO);}}});}
拍照存储部分:
private void takePhoto() {this.mLensEngine.photograph(null,new LensEngine.PhotographListener() {@Override public void takenPhotograph(byte[] bytes) {mHandler.sendEmptyMessage(STOP_PREVIEW);Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);saveBitmapToDisk(bitmap);}});}
2.2 创建视觉引擎,捕捉相机动态视频流后传给分析器
private
void createLensEngine() {Context context = this.getApplicationContext();// Create LensEnginethis.mLensEngine = new LensEngine.Creator(context, this.analyzer).setLensType(this.lensType).applyDisplayDimension(640, 480).applyFps(25.0f).enableAutomaticFocus(true).create();}
2.3 动态权限申请,挂接分析器和视觉引擎创建代码
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.activity_live_face_analyse);if (savedInstanceState != null) {this.lensType = savedInstanceState.getInt("lensType");}this.mPreview = this.findViewById(R.id.preview);this.createFaceAnalyzer();this.findViewById(R.id.facingSwitch).setOnClickListener(this);// Checking Camera Permissionsif (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {this.createLensEngine();} else {this.requestCameraPermission();}}private void requestCameraPermission() {final String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {ActivityCompat.requestPermissions(this, permissions, LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE);return;}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {if (requestCode != LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);return;}if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {this.createLensEngine();return;}}
结束语
怎么样,开发过程是不是特别简单,30 分钟就可以开发一个新特性出来!让我们一起体验下这个多人脸微笑抓包的效果。
单人笑脸抓拍:
多人笑脸抓拍:
基于人脸检测能力,还可以做哪些功能出来,请开放你的脑洞!这里不妨再给一些提示,比如:
通过识别耳朵、眼睛、鼻子、嘴巴、眉毛等脸部特征的位置,添加一些有趣的装饰特效。
通过识别面部的轮廓,做一些夸张的变形、拉伸,生成一些有趣好玩的人像图片,或者针对轮廓区域开发美颜功能。
通过年龄识别,对儿童沉迷于电子类产品的痛点,开发一些家长管控类功能。
通过检测眼睛盯着屏幕的时长,开发护眼提示的特性。
通过随机指令(摇头、眨眼、张嘴等)实现用户动作配合式活体检测功能。
通过综合运用用户的年龄、性别等的检测结果,给用户做相关商品推荐;
评论