android检测张嘴眨眼,Android/IOS 活体检测(眨眼,摇头,点头,张嘴,远近)

更新记录1.1.2(2021-05-24)ios优化活体算法1.1.1(2021-05-17)v1.1.1_release(2020.05.14)添加框的绘制在计算人脸关键点变化的过程上加入防并发处理优化摇头算法添加人脸大小的检测 防止人脸过近或者过远查看更多平台兼容性AndroidiOS适用版本区间:5.0 - 11.0 支持CPU类型:armeabi-v7a适用版本区间:9 - 14原生插件通...
摘要由CSDN通过智能技术生成

更新记录

1.1.2(2021-05-24)

ios优化活体算法

1.1.1(2021-05-17)

v1.1.1_release(2020.05.14)

添加框的绘制

在计算人脸关键点变化的过程上加入防并发处理

优化摇头算法

添加人脸大小的检测 防止人脸过近或者过远

查看更多

平台兼容性

Android

iOS

适用版本区间:5.0 - 11.0 支持CPU类型:armeabi-v7a

适用版本区间:9 - 14

原生插件通用使用流程:

购买插件,选择该插件绑定的项目。

在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。

根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。

打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。

开发完毕后正式云打包

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择

概述

Android/IOS活体检测 (眨眼,摇头,点头,张嘴,远近),前后端结合,确保活体检测结果安全可靠。(可用于实人认证

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Android端的活体检测,您可以使用OpenCV库。以下是一个简单的示例代码,用于检测用户是否张嘴或眨眼: ```java public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { private CameraBridgeViewBase mOpenCvCameraView; private CascadeClassifier mFaceDetector; private CascadeClassifier mEyeDetector; private Mat mGray; private int mAbsoluteFaceSize = 0; private float mRelativeFaceSize = 0.2f; private boolean mIsMouthOpen = false; private boolean mAreEyesClosed = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mOpenCvCameraView = findViewById(R.id.camera_view); mOpenCvCameraView.setCvCameraViewListener(this); mOpenCvCameraView.enableView(); // Load cascade classifiers for face and eye detection mFaceDetector = new CascadeClassifier(); mEyeDetector = new CascadeClassifier(); mFaceDetector.load(getFilePath("haarcascade_frontalface_default.xml")); mEyeDetector.load(getFilePath("haarcascade_eye.xml")); } @Override public void onCameraViewStarted(int width, int height) { mGray = new Mat(); } @Override public void onCameraViewStopped() { mGray.release(); } @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { Mat rgba = inputFrame.rgba(); // Convert to grayscale Imgproc.cvtColor(rgba, mGray, Imgproc.COLOR_RGBA2GRAY); // Calculate absolute face size if (mAbsoluteFaceSize == 0) { int height = mGray.rows(); if (Math.round(height * mRelativeFaceSize) > 0) { mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize); } } // Detect faces MatOfRect faces = new MatOfRect(); mFaceDetector.detectMultiScale(mGray, faces, 1.1, 2, 0 | Objdetect.CASCADE_SCALE_IMAGE, new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size()); // Iterate over detected faces for (Rect face : faces.toArray()) { // Draw rectangle around face Imgproc.rectangle(rgba, face.tl(), face.br(), new Scalar(0, 255, 0), 3); // Detect eyes within face Mat faceROI = mGray.submat(face); MatOfRect eyes = new MatOfRect(); mEyeDetector.detectMultiScale(faceROI, eyes); // Iterate over detected eyes for (Rect eye : eyes.toArray()) { Point center = new Point(face.x + eye.x + eye.width * 0.5, face.y + eye.y + eye.height * 0.5); int radius = (int) Math.round((eye.width + eye.height) * 0.25); Imgproc.circle(rgba, center, radius, new Scalar(255, 0, 0), 2); } // Detect mouth within face Rect mouthRect = new Rect(face.x, face.y + face.height / 2, face.width, face.height / 2); Mat mouthROI = mGray.submat(mouthRect); // Calculate mouth aspect ratio double mouthAspectRatio = calculateMouthAspectRatio(mouthROI); // Check if mouth is open if (mouthAspectRatio > 0.5) { mIsMouthOpen = true; } else { mIsMouthOpen = false; } // Check if eyes are closed if (eyes.toArray().length < 2) { mAreEyesClosed = true; } else { mAreEyesClosed = false; } } return rgba; } private double calculateMouthAspectRatio(Mat mouthROI) { // Convert to binary image using Otsu's thresholding Mat binary = new Mat(); Imgproc.threshold(mouthROI, binary, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); // Find contours List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchy = new Mat(); Imgproc.findContours(binary, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); // Find largest contour double maxArea = 0; MatOfPoint largestContour = null; for (MatOfPoint contour : contours) { double area = Imgproc.contourArea(contour); if (area > maxArea) { maxArea = area; largestContour = contour; } } // Calculate aspect ratio if (largestContour != null) { Rect boundingRect = Imgproc.boundingRect(largestContour); double aspectRatio = (double) boundingRect.width / boundingRect.height; return aspectRatio; } else { return 0; } } private String getFilePath(String fileName) { File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); File cascadeFile = new File(cascadeDir, fileName); try { InputStream is = getResources().openRawResource(R.raw.haarcascade_frontalface_default); FileOutputStream os = new FileOutputStream(cascadeFile); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } is.close(); os.close(); } catch (IOException e) { e.printStackTrace(); } return cascadeFile.getAbsolutePath(); } } ``` 这个示例代码使用了OpenCV库中的级联分类器(Cascade Classifier)来检测人脸和眼睛,以及计算嘴巴的宽高比(Mouth Aspect Ratio)来判断用户是否张嘴。如果您想要完整的活体检测功能,可能需要更复杂的算法和技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值