Android在线人脸识别登录系统

news/2024/11/20 9:20:58/

Android在线人脸识别登录系统

前言

最近需要做一个Android的在线人脸识别项目,需求是能够在线人脸识别登录,找了很多资料都是价格很高或者是离线保存样本的,最后选择免费的虹软人脸识别,经过查询很多资料,最终完结了该项目需求,现在把它分享出来,希望能够帮助到大家学习。


提示:以下是本篇文章正文内容,下面案例可供参考

一、系统简介

有了解过Android端虹软SDK的都知道,识别样本必须要先注册在本地,进行离线识别,这可能不符合大部分的需求,更多的可能是需要Android端在线识别。该系统使用虹软Java端第三方jar包,实现Android端人脸在线识别登录与注册功能。

二、系统设计

1.客户端

客户端分为注册和登录。注册时调用相机拍照,将回调的图片信息进行bas64格式发送至服务器。登录时调用相机采集视频信息,将图片信息压缩转化后实时发送至服务端登录匹配。

1.1注册

1、注册拍照代码如下(示例):

	/**** 拍照* @param view*/public void photograph(View view) {loadingDialog = new LoadingDialog(RegisterCameraActivity.this,"正在获取照片...", R.drawable.icon_logo);loadingDialog.show();mCamera.takePicture(null, null, new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] bytes, Camera camera) {File sdRoot = Environment.getExternalStorageDirectory();String dir = "/Camera/";String resultPath = sdRoot + dir + "IMG_Register.jpg";Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);Bitmap bitmap1 = adjustPhotoRotation(bitmap, 270);Imageutils.saveImage(bitmap1);if(bitmap != null){bitmapCompress(resultPath);}else {camera.stopPreview();camera.release();dismissLoading();}}});}

2、上传图片信息代码如下(示例):

		/**** 上传图片*/buttonc.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {showLoading();File sdRoot = Environment.getExternalStorageDirectory();String dir = "/Camera/";String resultPath = sdRoot + dir + "IMG_Register.jpg";String resultChangePath = sdRoot + dir + "IMG_Register_change.jpg";File file = new File(resultChangePath);File resultPathFile = new File(resultPath);if(!file.exists()){dismissLoading();return;}String ImgBase = Imageutils.imgTodata(resultChangePath);HashMap<String, String> params = new HashMap<>();String url = HttpUtils.FACE_ADD;params.put("file", ImgBase);params.put("username", username);HttpUtils.sendRequestToServer(url, params, new Callback() {@Overridepublic void onFailure(Request request, IOException e) {}@Overridepublic void onResponse(Response response) throws IOException {String string = response.body().string();JSONObject jsonObject = null;try {jsonObject = new JSONObject(string);int code = jsonObject.optInt("code");if(code == 14){runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(RegisterCameraActivity.this,"注册失败,未检出到人脸",Toast.LENGTH_SHORT).show();}});}else if(code == 0){if(file.exists()){file.delete();}if(resultPathFile.exists()){resultPathFile.delete();}if (loadingDialog != null){loadingDialog.dismiss();}Intent it = new Intent(RegisterCameraActivity.this, SelectActivity.class);startActivity(it);finish();}else {String message = jsonObject.optString("message");runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(RegisterCameraActivity.this,message,Toast.LENGTH_SHORT).show();}});}if (loadingDialog != null){loadingDialog.dismiss();}} catch (JSONException e) {e.printStackTrace();}}});}});Toast.makeText(RegisterCameraActivity.this,"请正视屏幕不要晃动",Toast.LENGTH_SHORT).show();}

1.2登录

登录Activity需要实现Camera.PreviewCallback接口,实现回调中的onPreviewFrame()方法进行视频流的采集。将采集到的流数据转化为图片格式,经过压缩处理后转化为bas64格式发送服务器进行匹配,必要时在这里可以使用线程池机制来增加效率。
采集图片信息并上传代码如下(示例):

	@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {String timeName = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()).toString();String fileName = "IMG_"+ timeName + ".jpg";File sdRoot = Environment.getExternalStorageDirectory();String dir = "/Camera/";File mkDir = new File(sdRoot, dir);if (!mkDir.exists())mkDir.mkdirs();File pictureFile = new File(sdRoot, dir + fileName);if (!pictureFile.exists()) {try {pictureFile.createNewFile();Camera.Parameters parameters = camera.getParameters();Camera.Size size = parameters.getPreviewSize();YuvImage image = new YuvImage(data,parameters.getPreviewFormat(), size.width, size.height,null);FileOutputStream filecon = new FileOutputStream(pictureFile);image.compressToJpeg(new Rect(0, 0, image.getWidth(), image.getHeight()),90, filecon);String path = pictureFile.getPath();Bitmap imageBitmap = BitmapFactory.decodeFile(path);Bitmap bitmap1 = adjustPhotoRotation(imageBitmap, 270);Imageutils.saveLoginImage(bitmap1,timeName);String fileLoginName = "IMG_Login_" + timeName + ".jpg";String resultChangePath = sdRoot + dir + fileLoginName;bitmapCompress(resultChangePath);/*新增压缩*/String ImgBase = Imageutils.imgTodata(resultChangePath);//开始上传ImgBase = ImgBase.replaceAll("[\\s*\t\n\r]", "");//上传HashMap<String, String> params = new HashMap<>();params.put("file", ImgBase);uploadImage(params,camera);} catch (IOException e) {e.printStackTrace();}}}

2.服务端

服务端使用Java语言编写,首先部署第三方jar包,配置好appid和key值。服务端接收到客户端传递过来的图片数据进行匹配,如果是注册,将图片信息保存至数据库,如果是登录,则查询数据库进行匹配。
服务器获取客户端发送图片信息处理代码如下(示例):

	/*** 人脸识别*/@ApiOperation(value="人脸识别", notes="待识别图像为base64格式字符串、必须指定人脸分组id")@RequestMapping(value = "/faceSearch", method = RequestMethod.POST)@ResponseBodypublic Result<FaceSearchResDto> faceSearch(@ApiParam(value = "人脸图像数据", required = true)@RequestParam("file")   		String file) throws Exception {if (groupId == null) {return Results.newFailedResult("groupId is null");}byte[] decode = Base64.decode(base64Process(file));BufferedImage bufImage = ImageIO.read(new ByteArrayInputStream(decode));ImageInfo imageInfo = ImageFactory.bufferedImage2ImageInfo(bufImage);//人脸特征获取byte[] bytes = faceEngineService.extractFaceFeature(imageInfo);if (bytes == null) {return Results.newFailedResult(ErrorCodeEnum.NO_FACE_DETECTED);}//人脸比对,获取比对结果List<FaceUserInfo> userFaceInfoList = faceEngineService.compareFaceFeature(bytes, groupId);if (CollectionUtil.isNotEmpty(userFaceInfoList)) {FaceUserInfo faceUserInfo = userFaceInfoList.get(0);FaceSearchResDto faceSearchResDto = new FaceSearchResDto();BeanUtil.copyProperties(faceUserInfo, faceSearchResDto);List<ProcessInfo> processInfoList = faceEngineService.process(imageInfo);if (CollectionUtil.isNotEmpty(processInfoList)) {//人脸检测List<FaceInfo> faceInfoList = faceEngineService.detectFaces(imageInfo);int left = faceInfoList.get(0).getRect().getLeft();int top = faceInfoList.get(0).getRect().getTop();int width = faceInfoList.get(0).getRect().getRight() - left;int height = faceInfoList.get(0).getRect().getBottom() - top;Graphics2D graphics2D = bufImage.createGraphics();graphics2D.setColor(Color.RED);//红色BasicStroke stroke = new BasicStroke(5f);graphics2D.setStroke(stroke);graphics2D.drawRect(left, top, width, height);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(bufImage, "jpg", outputStream);byte[] bytes1 = outputStream.toByteArray();faceSearchResDto.setImage("data:image/jpeg;base64," + Base64Utils.encodeToString(bytes1));faceSearchResDto.setAge(processInfoList.get(0).getAge());faceSearchResDto.setGender(processInfoList.get(0).getGender().equals(1) ? "女" : "男");faceSearchResDto.setUsername(faceUserInfo.getUsername());}return Results.newSuccessResult(faceSearchResDto);}return Results.newFailedResult(ErrorCodeEnum.FACE_DOES_NOT_MATCH);}

照片转化为bas64格式保存至数据库示意图在这里插入图片描述

总结

这次项目查询了很多资料,最终完成了Android人脸识别登录与注册功能,主要是使用Android端图片的压缩与转换,网络通讯,和第三方人脸识别sdk,希望能够对有需要的人有帮助。


http://www.ppmy.cn/news/836831.html

相关文章

安卓SDK——人脸识别

引 还是讯飞&#xff0c;前两篇文章 语音识别 https://blog.csdn.net/nishigesb123/article/details/90478104 语音合成 https://blog.csdn.net/nishigesb123/article/details/90478584 参考链接 官网&#xff1a;https://www.xfyun.cn/ 人脸识别说明文档&#xff1a;ht…

Android实现人脸识别(人脸检测)初识

title: Android实现人脸识别&#xff08;人脸检测&#xff09;初识 categories: Android tags:人脸识别人脸检测相机处理 date: 2020-05-21 11:35:51 介绍 本篇文章主要介绍一下移动端Android的人脸识别大致逻辑&#xff0c;后续文章会陆续放出干货&#xff0c;首先我们要明确…

人脸识别考勤系统安卓APP(手把手教学-手动滑稽)

由于百度API开始收费&#xff0c;所以这个应用暂时无法使用了&#xff0c;代码部分仍然有参考价值&#xff0c;建议大家自行更换token去验证。个人博客的下载验证码bug&#xff0c;已经fix。可以继续下载了。 更新于2022.02.13 ————————————————————我是分…

Android 人脸识别 活体检测 人脸对比

人脸识别技术应用于支付、门禁、以及手机解锁在当下已经非常成熟&#xff0c;作为一个Android 开发者&#xff0c;掌握人脸识别技术已经是必须做的事情了&#xff0c;市面上比较流行的人脸识别API主要有阿里云&#xff08;5000条以内免费&#xff09;、腾讯云&#xff08;收费&…

Android开发实现人脸识别

之前看到有人在博客写用face做人脸识别app&#xff0c;后来我也照着教程去试了一遍&#xff0c;发现根本行不通&#xff0c;原因在于他调用的库是旧版本&#xff0c;face已经全面更新了版本.后来我照着face官网新版本的API文档打了一遍代码&#xff0c;发现识别的结果还算差强人…

Android自带的人脸识别

1. Android自带的人脸识别Android自带的人脸识别只能识别出人脸在画面中的位置&#xff0c;中点&#xff0c;眼间距&#xff0c;角度等基本特性&#xff0c;提供给拍照性质的应用使用。从基本功能中不能得出明显的特征数据 2. 底层库支持external/neven/* 3. 接口…

Android 实现人脸识别

引言 基于虹软人脸识别引擎&#xff0c;在Android平台上实现人脸识别功能&#xff0c;即使在离线的情况下依旧运行&#xff0c;不被人采集个人照片的感觉&#xff0c;还是爽爽的。经过整个测试过来&#xff0c;虹软的人脸识别还是很强大的&#xff0c;人脸检测可以控制在20ms之…

Android 人脸识别

1.人脸识别测试&#xff0c;如下&#xff1a; 2.导入新项目如下&#xff1a; 3.翻译 template:模板 tracker:跟踪器 lock:锁定 purge:清除 frame:框架我同事发给我这项目&#xff0c;叫我改目录才能查看&#xff0c;他说这项目的人脸识别可以注册人脸图和特征&#xff0c;注册…