android检测张嘴眨眼,手机端APP活体真活人检测扫描人脸识别SDK之张嘴摇头眨眼点头确认真人非图片...

关键词:活体活人检测、手机端、APP软件、SDK原生态开发包、人脸识别、张嘴、摇头、点头、眨眼、左右摇头

96a538720761?utm_source=desktop&utm_medium=timeline

image

随着AI智能的应用、发展,越来越多的行业运用了人脸识别,而人脸识别最重要的一步是活体检测,防止图片或者视屏冒充真人。手机端APP上面很多需要人脸的比对或者拍照本人,如果没有活体检测这一重要步骤,是不是会经常会出现,图片视频冒充真人导致APP或者其他手机端的人脸比对等应用形同虚设呢?活体检测---是否为真人就显得尤为必要了。

其他手机APP为了高度保证用户使用的安全问题使用的虹膜、指纹、密码等我就不细说了。主要讲讲如何实现手机端iOS、Android两个平台APP上的人脸识别之活体检测。流程、主要功能、附带demo演示程序、以及行业应用。

活体检测概述:手机、移动端、APP人脸活体检测软件,。

有动作活体检测--实时反馈眼睛、嘴巴、头部姿态等状态,通过给用户设定完成相关动作,判断是否为活体。支持指定生效的动作及顺序。

多种场景版本----支持 iOS、Android 平台,可以在移动设备上离线运行,适应各种应用场景。

活体检测流程:

1. 检测定位人脸,持续跟踪,防止人与人或人与照片的切换。

2. 随机指令动作(眨眨眼、张张嘴等 5 个动作),防止视频和照片攻击。

3. 持续检测防止中途切换人,直至验证通过。

活体检测功能特点:

可靠:人脸活体和照片、视频的辨识准确率高达98.8%以上;

快速:检测时间小于1 秒;

便:活体检测界面有文字、语音、动画三种提示指令引导用户操作。

活体检测SDK 应用:

1. 金融行业:人脸登录验证,网上支付安全验证等。

2. 银行场景:用户远程开户的身份验证等。

3. 驾校场景:考生身份认证,路考过程监督等。

4. 楼宇场景:门禁系统身份认证以及人脸识别锁等。

5. 运营商场景:SIM 卡实名认证,移动支付等。

6. 防疲劳识别:识别司机疲劳程度,给予预警信息等。

7. 社保人脸识别验证方案:养老保险金的领取;公积金领取等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值