package com.zn.facealivelib.mvp;
import static org.opencv.core.CvType.CV_8UC3;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.util.Log;
import com.seeta.sdk.FaceAntiSpoofing;
import com.seeta.sdk.FaceDetector;
import com.seeta.sdk.FaceLandmarker;
import com.seeta.sdk.SeetaDevice;
import com.seeta.sdk.SeetaImageData;
import com.seeta.sdk.SeetaModelSetting;
import com.seeta.sdk.SeetaPointF;
import com.seeta.sdk.SeetaRect;
import com.zn.facealivelib.config.AppConfig;
import com.zn.facealivelib.face.FaceHelper;
import com.zn.facealivelib.mvp.VerificationContract;
import com.zn.facealivelib.utils.CachedStatusAndImage;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.imgproc.Imgproc;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class PresenterImpl implements VerificationContract.Presenter {
static {
System.loadLibrary("opencv_java3");
}
private static final String TAG = "PresenterImpl";
private VerificationContract.View mView;
public SeetaImageData imageData = new SeetaImageData(WIDTH, HEIGHT, 3);
FaceAntiSpoofing.Status state = FaceAntiSpoofing.Status.DETECTING;//初始状态
static String fdModel = FaceHelper.MODELPATH + "/face_detector.csta";
static String pdModel = FaceHelper.MODELPATH + "/face_landmarker_pts5.csta";
static String fasModel1 = FaceHelper.MODELPATH + "/fas_first.csta";
static String fasModel2 = FaceHelper.MODELPATH + "/fas_second.csta";
FaceDetector faceDetector = null;
FaceLandmarker faceLandmarker = null;
FaceAntiSpoofing faceAntiSpoofing = null;
private static int WIDTH = 480;
private static int HEIGHT = 640;
public static class TrackingInfo {
public Mat matBgr;
public Mat matGray;
public SeetaRect faceInfo = new SeetaRect();
public Rect faceRect = new Rect();
public long birthTime;
public long lastProccessTime;
}
private HandlerThread mFaceTrackThread;
private HandlerThread mFasThread;
{
mFaceTrackThread = new HandlerThread("FaceTrackThread", Process.THREAD_PRIORITY_MORE_FAVORABLE);
mFasThread = new HandlerThread("FasThread", Process.THREAD_PRIORITY_MORE_FAVORABLE);
mFaceTrackThread.start();
mFasThread.start();
}
private Mat matNv21 = new Mat(AppConfig.CAMERA_PREVIEW_HEIGHT + AppConfig.CAMERA_PREVIEW_HEIGHT / 2,
AppConfig.CAMERA_PREVIEW_WIDTH, CvType.CV_8UC1);
public void SeetaInit()
{
try{
if(faceDetector == null || faceLandmarker == null || faceAntiSpoofing == null)
{
faceDetector = new FaceDetector(new SeetaModelSetting(0, new String[]{fdModel}, SeetaDevice.SEETA_DEVICE_AUTO));
faceLandmarker = new FaceLandmarker(new SeetaModelSetting(0, new String[]{pdModel}, SeetaDevice.SEETA_DEVICE_AUTO));
SeetaModelSetting fasSetting = new SeetaModelSetting(0, new String[]{fasModel1, fasModel2}, SeetaDevice.SEETA_DEVICE_AUTO);
faceAntiSpoofing = new FaceAntiSpoofing(fasSetting);
float clarity = 0.30f;
float fasThresh = 0.30f;
faceAntiSpoofing.SetThreshold(clarity, fasThresh);
};
faceDetector.set(FaceDetector.Property.PROPERTY_MIN_FACE_SIZE, 20);
}
catch (Exception e)
{
Log.e(TAG, e.toString());
}
}
public PresenterImpl(VerificationContract.View view) {
mView = view;
mView.setPresenter(this);
SeetaInit();
}
private Handler mFaceTrackingHandler = new Handler(mFaceTrackThread.getLooper()) {
private SeetaImageData imageData = new SeetaImageData(WIDTH, HEIGHT, 3);
@Override
public void handleMessage(Message msg) {
final TrackingInfo trackingInfo = (TrackingInfo) msg.obj;
trackingInfo.matBgr.get(0, 0, imageData.data);
SeetaRect[] faces = faceDetector.Detect(imageData);
//设一个初始值
trackingInfo.faceInfo.x = 0;
trackingInfo.faceInfo.y = 0;
trackingInfo.faceInfo.width = 0;
trackingInfo.faceInfo.height = 0;
if (faces.length != 0 ) {
int maxIndex = 0;
double maxWidth = 0;
for(int i=0;i<faces.length;++i)
{
if(faces[i].width > maxWidth)
{
maxIndex = i;
maxWidth = faces[i].width;
}
}
trackingInfo.faceInfo = faces[maxIndex];
trackingInfo.faceRect.x = faces[maxIndex].x;
trackingInfo.faceRect.y = faces[maxIndex].y;
trackingInfo.faceRect.width = faces[maxIndex].width;
trackingInfo.faceRect.height = faces[maxIndex].height;
trackingInfo.lastProccessTime = System.currentTimeMillis();
mView.drawFaceRect(trackingInfo.faceRect);
mFasHandler.removeMessages(0);
mFasHandler.obtainMessage(0, trackingInfo).sendToTarget();
} else {
mView.drawFaceRect(null);
state = FaceAntiSpoofing.Status.DETECTING;
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
mView.setStatus(FaceAntiSpoofing.Status.DETECTING,null, null,null);
}
});
}
}
};
static int frameNumThreshold = 5;//超过该帧数后才进行活体识别,过渡摄像头曝光过程
private Handler mFasHandler = new Handler(mFasThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
final TrackingInfo trackingInfo = (TrackingInfo) msg.obj;
trackingInfo.matGray = new Mat();
trackingInfo.matBgr.get(0, 0, imageData.data);
//活体识别
if(trackingInfo.faceInfo.width != 0) {//存在人脸
//摄像头过渡
if(CachedStatusAndImage.currentFrameNum < frameNumThreshold) {
++CachedStatusAndImage.currentFrameNum;
Log.e("frame index", "" + CachedStatusAndImage.currentFrameNum);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//null为正在检测中的标志
mView.setStatus(null, trackingInfo.matBgr, trackingInfo.faceRect,null);
}
});
} else {
//特征点检测
SeetaPointF[] points = new SeetaPointF[5];
faceLandmarker.mark(imageData, trackingInfo.faceInfo, points);
SeetaRect faceInfo = trackingInfo.faceInfo;
state = faceAntiSpoofing.Predict(imageData, faceInfo, points);
CachedStatusAndImage.status = state;
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if(state == FaceAntiSpoofing.Status.DETECTING) {//没有人脸
} else {
if(CachedStatusAndImage.detectedBitmap != null) {
// CachedStatusAndImage.detectedBitmap.recycle();
}
CachedStatusAndImage.detectedBitmap = Bitmap.createBitmap(trackingInfo.matBgr.width(), trackingInfo.matBgr.height(),
没有合适的资源?快使用搜索试试~ 我知道了~
Java开发基于seetaface6的人脸识别(活体检测)的封装源码.zip
共90个文件
java:27个
xml:21个
webp:10个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 71 浏览量
2023-09-05
17:24:07
上传
评论 1
收藏 71.39MB ZIP 举报
温馨提示
【资源说明】 Java开发基于seetaface6的人脸识别(活体检测)的封装源码.zipJava开发基于seetaface6的人脸识别(活体检测)的封装源码.zipJava开发基于seetaface6的人脸识别(活体检测)的封装源码.zipJava开发基于seetaface6的人脸识别(活体检测)的封装源码.zipJava开发基于seetaface6的人脸识别(活体检测)的封装源码.zipJava开发基于seetaface6的人脸识别(活体检测)的封装源码.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
Java开发基于seetaface6的人脸识别(活体检测)的封装源码.zip (90个子文件)
gradle.properties 1KB
gradle
wrapper
gradle-wrapper.jar 58KB
gradle-wrapper.properties 230B
facealivelib
src
androidTest
java
com
zn
facealivelib
ExampleInstrumentedTest.java 757B
test
java
com
zn
facealivelib
ExampleUnitTest.java 380B
main
assets
fas_first.csta 42.66MB
face_detector.csta 3.87MB
fas_second.csta 18.22MB
face_landmarker_pts5.csta 412KB
java
com
zn
facealivelib
utils
FileUtils.java 1KB
CachedStatusAndImage.java 537B
mvp
exceptions
CameraUnavailableException.java 651B
PresenterImpl.java 11KB
VerificationContract.java 725B
face
FaceHelper.java 3KB
constants
camera
CameraPreview2.java 6KB
CameraPreview.java 9KB
CameraCallbacks.java 226B
ErrorCode.java 538B
config
AppConfig.java 365B
seeta
sdk
FaceLandmarker.java 699B
FaceDetector.java 2KB
FaceAntiSpoofing.java 1KB
SeetaImageData.java 460B
SeetaRect.java 132B
SeetaDevice.java 310B
SeetaModelSetting.java 487B
ImageDataFormatUtils.java 550B
SeetaSize.java 96B
SeetaPointF.java 95B
res
values
attrs.xml 236B
jniLibs
armeabi-v7a
libSeetaFaceAntiSpoofingX600_java.so 149KB
libSeetaAuthorize.so 769KB
libSeetaFaceAntiSpoofingX600.so 798KB
libopencv_java3.so 10.85MB
libSeetaFaceDetector600.so 718KB
libTenniS.so 4.36MB
libSeetaFaceLandmarker600_java.so 149KB
libSeetaFaceLandmarker600.so 766KB
libSeetaFaceDetector600_java.so 149KB
AndroidManifest.xml 121B
proguard-rules.pro 750B
libs
opencv-3.2.jar 238KB
build.gradle 1KB
consumer-rules.pro 0B
.gitignore 6B
说明.md 633B
app
src
androidTest
java
com
zn
facealivever
ExampleInstrumentedTest.java 752B
test
java
com
zn
facealivever
ExampleUnitTest.java 380B
main
java
com
zn
facealivever
FaceActivity.java 7KB
MainActivity.java 1KB
res
mipmap-xxhdpi
ic_launcher_round.webp 6KB
ic_launcher.webp 3KB
mipmap-hdpi
ic_launcher_round.webp 3KB
ic_launcher.webp 1KB
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-anydpi-v26
ic_launcher.xml 272B
ic_launcher_round.xml 272B
values-night
themes.xml 814B
mipmap-mdpi
ic_launcher_round.webp 2KB
ic_launcher.webp 982B
mipmap-xxxhdpi
ic_launcher_round.webp 8KB
ic_launcher.webp 4KB
mipmap-xhdpi
ic_launcher_round.webp 4KB
ic_launcher.webp 2KB
xml
data_extraction_rules.xml 551B
backup_rules.xml 478B
values
colors.xml 378B
strings.xml 202B
themes.xml 814B
layout
activity_face.xml 1KB
activity_main.xml 533B
drawable
ic_launcher_background.xml 5KB
logo.png 4KB
AndroidManifest.xml 2KB
proguard-rules.pro 750B
build.gradle 1KB
.gitignore 6B
gradlew.bat 3KB
build.gradle 229B
.idea
deploymentTargetDropDown.xml 540B
dbnavigator.xml 22KB
vcs.xml 247B
misc.xml 453B
compiler.xml 169B
gradle.xml 929B
.gitignore 47B
settings.gradle 397B
gradlew 6KB
sh.exe.stackdump 711B
共 90 条
- 1
资源评论
- mlml0042024-01-24资源很赞,希望多一些这类资源。
Make程序设计
- 粉丝: 5633
- 资源: 3568
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功