0
点赞
收藏
分享

微信扫一扫

Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

狐沐说 2022-03-19 阅读 60

Y Y Y Y

Y Y Y Y

V U V U

V U V U

什么是Bgr24

Bgr24:Bgr24像素格式是一种采用24BPP的sRGB格式。每个颜色通道(蓝色blue, 绿色green, 红色red)各占8BPP(位/像素)。

[]( )8.自定义

====================================================================

1.appbuild.gradle中新增代码:

compile 'com.guo.android_extend:android-extend:1.0.5'

2.FaceServer.java中新增代码:

......

public static List<FaceImgRegisterInfo> faceImgRegisterInfoList;

......

//特征

private static List<FaceRegisterInfo> MyfaceFeatureRegisterInfoList;

//导入手机里的10000个人脸图片

public static List<FaceImgRegisterInfo> MyimportFaceImgRegisterInfo;

//导入手机里的10000个特征

public static List<FaceRegisterInfo> MyimportFaceFeatureRegisterInfo;

......

//获取图片和姓名的信息

public int getImgAndName(Context context){

synchronized (this){

if (ROOT_PATH == null) {

ROOT_PATH = context.getFilesDir().getAbsolutePath();

}

File imgDir = new File(ROOT_PATH + File.separator + SAVE_IMG_DIR);

if (!imgDir.exists() || !imgDir.isDirectory()) {

return 0;

}

File[] imgFiles = imgDir.listFiles();

if (imgFiles == null || imgFiles.length == 0) {

return 0;

}

faceImgRegisterInfoList = new ArrayList<>();

for (File imgFile : imgFiles) {

faceImgRegist

Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

erInfoList.add(new FaceImgRegisterInfo(imgFile.getPath(), getName(imgFile.getName())));

}

return faceImgRegisterInfoList.size();

}

}

private String getName(String path){

int start= path.lastIndexOf(":");

int end = path.lastIndexOf(".");

return path.substring(start+1,end);

}

3.activity_face_manage.xml中新增代码:

<com.guo.android_extend.widget.HListView

android:id="@+id/hlistView"

android:layout_width="wrap_content"

android:layout_height="100dp"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:scrollbars="none"

app:dividerHeight="1dp"

app:listSelector="@android:drawable/list_selector_background"

android:layout_gravity="center_horizontal"/>

<TextView

android:id="@+id/tv_number"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:textSize="30dp"

android:textColor="#000000"/>

4.FaceManageActivity.java中新增代码:

......

private HListView mHListView;

public RegisterViewAdapter mRegisterViewAdapter;

......

mHListView = (HListView) findViewById(R.id.hlistView);

TextView facenum = (TextView) findViewById(R.id.tv_number);

downFile();

mRegisterViewAdapter = new RegisterViewAdapter(FaceManageActivity.this);

mHListView.setAdapter(mRegisterViewAdapter);

......

private void downFile()

{

int faceNum = FaceServer.getInstance().getFaceNumber(this);

if (faceNum == 0) {

showToast(getString(R.string.batch_process_no_face_need_to_delete));

}else {

FaceServer.getInstance().getImgAndName(this);

}

}

......

class Holder {

ExtImageView siv;

TextView tv;

}

class RegisterViewAdapter extends BaseAdapter {

Context mContext;

LayoutInflater mLInflater;

public RegisterViewAdapter(Context c) {

mContext = c;

mLInflater = LayoutInflater.from(mContext);

}

@Override

public int getCount() {

if (FaceServer.faceImgRegisterInfoList==null){

return 0;

}else {

facenum.setText("注册的人脸数:" + FaceServer.faceImgRegisterInfoList.size() + "个");

return FaceServer.faceImgRegisterInfoList.size();

}

}

@Override

public Object getItem(int position) {

return null;

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

Holder holder = null;

if (convertView != null)

holder = (Holder) convertView.getTag();

else {

convertView = mLInflater.inflate(R.layout.item_sample, null);

holder = new Holder();

holder.siv = (ExtImageView) convertView.findViewById(R.id.imageView1);

holder.tv = (TextView) convertView.findViewById(R.id.textView1);

convertView.setTag(holder);

}

if (!(FaceServer.faceImgRegisterInfoList == null)){

if (!FaceServer.faceImgRegisterInfoList.isEmpty()){

FaceImgRegisterInfo face = FaceServer.faceImgRegisterInfoList.get(position);

holder.tv.setText(face.getName());

String path = face.getImgpath();

holder.siv.setImageBitmap(BitmapFactory.decodeFile(path));

holder.siv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

convertView.setWillNotDraw(false);

}

}

return convertView;

}

}

......

[]( )9.查看手机文件里的10000个图片和特征

====================================================================================

1.FaceManageActivity.java

private static final String ROOT_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "arcfacedemo";

可以发现Environment.getExternalStorageDirectory().getAbsolutePath(),这路经:/storage/emulated/0/,但是我想知道这路经到底在哪,去百度找了很多都找不到,看来是说无法查看

这路经可以如何改才能查看

怎么改 先看一下

在这里插入图片描述

FaceServer.java,先查看图片

public boolean registerNv21(Context context, byte[] nv21, int width, int height, FaceInfo faceInfo, String name) {

synchronized (this) {

......

if (ROOT_PATH == null) {

ROOT_PATH = context.getFilesDir().getAbsolutePath();

}

......

//图片存储的文件夹

File imgDir = new File(ROOT_PATH + File.separator + SAVE_IMG_DIR);

if (!imgDir.exists() && !imgDir.mkdirs()) {

Log.e(TAG, "registerNv21: can not create image directory");

return false;

}

File file = new File(imgDir + File.separator + userName + IMG_SUFFIX);

// 创建一个头像的Bitmap,存放旋转结果图

Bitmap headBmp = getHeadImage(nv21, width, height, faceInfo.getOrient(), cropRect, ArcSoftImageFormat.NV21);

FileOutputStream fosImage = new FileOutputStream(file);

headBmp.compress(Bitmap.CompressFormat.JPEG, 100, fosImage);

fosImage.close();

......

}

}

改的和FaceServer.java差不多

String path = Environment.getExternalStorageDirectory().getPath();

//SAVE_IMG_DIR = "register" + File.separator + "imgs";

File MyImgDir = new File(path + File.separator +SAVE_IMG_DIR);

if (!MyImgDir.exists() && !MyImgDir.mkdirs()) {

Log.e(TAG, "已新建文件夹");

return;

}

for (FaceImgRegisterInfo Mypath : faceImgRegisterInfoList){

File file = new File(MyImgDir + File.separator + Mypath.getName());

Bitmap bitmap = BitmapFactory.decodeFile(Mypath.getImgpath());

try {

FileOutputStream fosImage = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fosImage);

fosImage.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

查看手机里的路经/storage/emulated/0/register/imgs/如下图:

在这里插入图片描述

FaceServer.java中新增代码 就是图片和特征,完整的代码

//把一个隐藏的文件复制到另一个显示的文件(图片和特征)

public void copy() {

synchronized (this) {

String path = Environment.getExternalStorageDirectory().getPath();

//复制到另一个显示的图片文件

File MyImgDir = new File(path + File.separator + SAVE_IMG_DIR);

if (!MyImgDir.exists() && !MyImgDir.mkdirs()) {

Log.e(TAG, "已新建文件夹");

} else {

for (FaceImgRegisterInfo Mypath : faceImgRegisterInfoList) {

File file = new File(MyImgDir + File.separator + Mypath.getName());

Bitmap bitmap = BitmapFactory.decodeFile(Mypath.getImgpath());

try {

FileOutputStream fosImage = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fosImage);

fosImage.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

File featureDir = new File(ROOT_PATH + File.separator + SAVE_FEATURE_DIR);

if (!featureDir.exists() || !featureDir.isDirectory()) {

return;

}

File[] featureFiles = featureDir.listFiles();

if (featureFiles == null || featureFiles.length == 0) {

return;

}

MyfaceFeatureRegisterInfoList = new ArrayList<>();

for (File featureFile : featureFiles) {

try {

FileInputStream fis = new FileInputStream(featureFile);

byte[] feature = new byte[FaceFeature.FEATURE_SIZE];

fis.read(feature);

fis.close();

MyfaceFeatureRegisterInfoList.add(new FaceRegisterInfo(feature, featureFile.getName()));

} catch (IOException e) {

e.printStackTrace();

}

}

//复制到另一个显示的特征文件

File MyfeatureDir = new File(path + File.separator + SAVE_FEATURE_DIR);

if (!MyfeatureDir.exists() && !MyfeatureDir.mkdirs()) {

Log.e(TAG, "已新建文件夹");

return;

}

for (FaceRegisterInfo bytedata : MyfaceFeatureRegisterInfoList) {

File file = new File(MyfeatureDir + File.separator + bytedata.getName());

FileOutputStream fosFeature = null;

try {

fosFeature = new FileOutputStream(file);

fosFeature.write(bytedata.getFeatureData());

fosFeature.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

查看手机里的路经/storage/emulated/0/register/Features/如下图:

在这里插入图片描述

[]( )10.如何导入手机里的图片和特征到人脸库里

====================================================================================

在这里插入图片描述

在这里插入图片描述

1.FaceManageActivity.java中新增代码:

public void BtnImport(View view){

FaceServer.getInstance().MyImport();

FaceServer.getInstance().getImgAndName(this);

mRegisterViewAdapter.notifyDataSetChanged();

}

2.FaceServer.java中新增代码:

public void MyImport(){

synchronized (this) {

String path = Environment.getExternalStorageDirectory().getPath();

String SAVE_IMG_DIR2 = "register2" + File.separator + "imgs2";

String SAVE_FEATURE_DIR2 = "register2" + File.separator + "features2";

File imgfile = new File(path + File.separator + SAVE_IMG_DIR2);

if (!imgfile.exists() || !imgfile.isDirectory()) {

return;

}

File[] imgFiles = imgfile.listFiles();

if (imgFiles == null || imgFiles.length == 0) {

return;

}

File featurefile = new File(path + File.separator + SAVE_FEATURE_DIR2);

if (!featurefile.exists() || !featurefile.isDirectory()) {

return;

}

File[] featureFiles = featurefile.listFiles();

if (featurefile == null || featurefile.length() == 0) {

return;

}

MyimportFaceImgRegisterInfo = new ArrayList<>();

for (File imgFile : imgFiles) {

MyimportFaceImgRegisterInfo.add(new FaceImgRegisterInfo(imgFile.getPath(), imgFile.getName()));

}

MyimportFaceFeatureRegisterInfo = new ArrayList<>();

for (File featureFile : featureFiles) {

FileInputStream fis = null;

try {

fis = new FileInputStream(featureFile);

byte[] feature = new byte[FaceFeature.FEATURE_SIZE];

fis.read(feature);

fis.close();

MyimportFaceFeatureRegisterInfo.add(new FaceRegisterInfo(feature, featureFile.getName()));

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//图片存储的文件夹

File imgDir = new File(ROOT_PATH + File.separator + SAVE_IMG_DIR);

if (!imgDir.exists() && !imgDir.mkdirs()) {

Log.e(TAG, "registerNv21: can not create image directory");

return;

}

for (FaceImgRegisterInfo img : MyimportFaceImgRegisterInfo) {

File file = new File(imgDir + File.separator + img.getName());

Bitmap bitmap = BitmapFactory.decodeFile(img.getImgpath());

FileOutputStream fosImage = null;

try {

fosImage = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fosImage);

fosImage.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//特征存储的文件夹

File featureDir = new File(ROOT_PATH + File.separator + SAVE_FEATURE_DIR);

if (!featureDir.exists() && !featureDir.mkdirs()) {

Log.e(TAG, "已建文件夹");

return;

}

for (FaceRegisterInfo feature : MyimportFaceFeatureRegisterInfo) {

File file = new File(featureDir + File.separator + feature.getName());

FileOutputStream fosFeature = null;

try {

fosFeature = new FileOutputStream(file);

fosFeature.write(feature.getFeatureData());

fosFeature.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

《设计思想解读开源框架》

Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

第一章、 热修复设计

  • 第一节、 AOT/JIT & dexopt 与 dex2oat

  • 第二节、 热修复设计之 CLASS_ISPREVERIFIED 问题

  • 第三节、热修复设计之热修复原理

  • 第四节、Tinker 的集成与使用(自动补丁包生成)

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    第二章、 插件化框架设计

  • 第一节、 Class 文件与 Dex 文件的结构解读

  • 第二节、 Android 资源加载机制详解

  • 第三节、 四大组件调用原理

  • 第四节、 so 文件加载机制

  • 第五节、 Android 系统服务实现原理

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    第三章、 组件化框架设计

  • 第一节、阿里巴巴开源路由框——ARouter 原理分析

  • 第二节、APT 编译时期自动生成代码&动态类加载

  • 第三节、 Java SPI 机制

  • 第四节、 AOP&IOC

  • 第五节、 手写组件化架构

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    第四章、图片加载框架

  • 第一节、图片加载框架选型

  • 第二节、Glide 原理分析

  • 第三节、手写图片加载框架实战

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    第五章、网络访问框架设计

  • 第一节、网络通信必备基础

  • 第二节、OkHttp 源码解读

  • 第三节、Retrofit 源码解析

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    第六章、 RXJava 响应式编程框架设计

  • 第一节、链式调用

  • 第二节、 扩展的观察者模式

  • 第三节、事件变换设计

  • 第四节、Scheduler 线程控制

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    第七章、 IOC 架构设计

  • 第一节、 依赖注入与控制反转

  • 第二节、ButterKnife 原理上篇、中篇、下篇

  • 第三节、Dagger 架构设计核心解密

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    第八章、 Android 架构组件 Jetpack

  • 第一节、 LiveData 原理

  • 第二节、 Navigation 如何解决 tabLayout 问题

  • 第三节、 ViewModel 如何感知 View 生命周期及内核原理

  • 第四节、 Room 架构方式方法

  • 第五节、 dataBinding 为什么能够支持 MVVM

  • 第六节、 WorkManager 内核揭秘

  • 第七节、 Lifecycles 生命周期

    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)
    本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
    Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

举报

相关推荐

0 条评论