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.app
的build.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
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();
}
}
}
《设计思想解读开源框架》
第一章、 热修复设计
-
第一节、 AOT/JIT & dexopt 与 dex2oat
-
第二节、 热修复设计之 CLASS_ISPREVERIFIED 问题
-
第三节、热修复设计之热修复原理
-
第四节、Tinker 的集成与使用(自动补丁包生成)
第二章、 插件化框架设计
-
第一节、 Class 文件与 Dex 文件的结构解读
-
第二节、 Android 资源加载机制详解
-
第三节、 四大组件调用原理
-
第四节、 so 文件加载机制
-
第五节、 Android 系统服务实现原理
第三章、 组件化框架设计
-
第一节、阿里巴巴开源路由框——ARouter 原理分析
-
第二节、APT 编译时期自动生成代码&动态类加载
-
第三节、 Java SPI 机制
-
第四节、 AOP&IOC
-
第五节、 手写组件化架构
第四章、图片加载框架
-
第一节、图片加载框架选型
-
第二节、Glide 原理分析
-
第三节、手写图片加载框架实战
第五章、网络访问框架设计
-
第一节、网络通信必备基础
-
第二节、OkHttp 源码解读
-
第三节、Retrofit 源码解析
第六章、 RXJava 响应式编程框架设计
-
第一节、链式调用
-
第二节、 扩展的观察者模式
-
第三节、事件变换设计
-
第四节、Scheduler 线程控制
第七章、 IOC 架构设计
-
第一节、 依赖注入与控制反转
-
第二节、ButterKnife 原理上篇、中篇、下篇
-
第三节、Dagger 架构设计核心解密
第八章、 Android 架构组件 Jetpack
-
第一节、 LiveData 原理
-
第二节、 Navigation 如何解决 tabLayout 问题
-
第三节、 ViewModel 如何感知 View 生命周期及内核原理
-
第四节、 Room 架构方式方法
-
第五节、 dataBinding 为什么能够支持 MVVM
-
第六节、 WorkManager 内核揭秘
-
第七节、 Lifecycles 生命周期
本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…