能检测出是不是虚拟定位了,然后要求人脸检测定位识

钉钉现在能检测出是不是虚拟定位了,然后要求人脸识别_百度知道
钉钉现在能检测出是不是虚拟定位了,然后要求人脸识别
我有更好的答案
iPhone用PhantomGPS,安全
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。7411人阅读
人脸检测(44)
1 Face++:
其提供的技术服务有1:人脸检测(人脸检测追踪,人脸关键点检测) 2:人脸分析(微笑分析,性别年龄种族表情)3:人脸识别(1:1,1:N,大规模人脸搜索)。我需要关注的是这里的人脸关键点检测的实现。Face++为美图秀秀,美颜相机提供人脸关键点检测的技术服务。
2 Face++一个采访问题,能够了解人脸识别技术的整个流程。
CSDN移动:可否介绍一下,典型的人脸识别系统是什么样子的?
印奇:当今的人脸识别系统虽然包含无数细节和各种工程技巧,但大的系统框架不外乎如下图所示的流程:一张人脸图片输入后,需要先找到人脸的位置(人脸检测),然后在这个基础上定位人脸关键点的位置(如眼睛中心或嘴角等),每个系统关键提取的数量相差很大,有的只有左右眼睛中心两个点,有的可能多达近百个点。这些点的位置一是用来做人脸的几何校正,即把人脸通过缩放、旋转、拉伸等图像变化变到一个比较标准的大小位置。这样待识别的人脸区域会更加规整,便于后续进行匹配。同时,现在的实际系统一般也都配有人脸光学校正模块,通过一些滤波的方法,去除一些对光照更加敏感的面部特征。在做完这些预处理之后,就是从人脸区域提取各种特征,包括LBP、HOG、Gabor等。最终相关的特征会连接成一个长的特征向量(Feature&Vector),然后匹配出人脸的相似度,根据相似度的大小,系统会判定两张图片到底是不是一个人。不难看出,人脸识别技术还是一个系统链条较长,较为有技术门槛的领域。因为这条流水线的每个环节可能都会严重影响最终系统性能,所以一个好的人脸识别技术公司需要在各个环节上追求细节,建立自己的技术优势,最终才有可能在最后的人脸识别精度上有出色的表现。
3 人类识别人脸用的是什么算法:
上面链接是知乎上面的讨论,有一个关于生物学方面的解释。
又一个Face++的专访:
通过下面这段话可以了解到目前的一些测试平台:
人脸检测(在照片中精准定位人脸位置的算法),在世界公开评测集FDDB 排名人脸关键点检测(精准定位面部关键部门的位置),在世界公开评测比赛300-W排名。在最重要的互联网图片人脸识别(Face recognition) 比赛LFW中,Face++团队更是力压Facebook人脸团队 (前face.com团队),获得世界。在极难识别的互联网新闻图片上,获得了97.3%的准确率。
Face++:&Face++已经能够较为稳定地应对复杂的光照和人脸姿态,但过于极端的光照和姿态还是十分困难。Face++的全线技术都更新为大数据深度学习算法,通过收集的海量人脸照片,新型的神经网络算法可以通过大数据训练形成性能更好的人脸检测,人脸分析,和人脸识别技术。
所以我的感觉是技术实现的方式采用:深度学习与传统算法相结合,互补的方式,并注重深度学习方面的创新。Face++ 目前发布的两篇论文,关键点检测和人脸特征表示都是基于DCNN的技术。
SegmentFault:&Face++的算法研发用到了C++、Matlab和Python?能比较下Matlab和Python在视觉算法研究方面的优势和不足么?
Face++:&优势是比较糙快猛,方便验证idea;落实到系统和实用级别,可能还是要采用C++。所以用matlab验证完idea后,用C++做实现。不妨申请下Face++的实习生。
4 阅读文献《人脸特征点定位研究与应用-吴证》
文中提到几种人脸关键点检测的方法:
1投影(五官灰度值较周围皮肤灰度值低)
2基于先验规则(先验知识指的是人脸比如眼睑、虹膜等一些已知的灰度、形状信息)
3基于几何形状(比如可变形模板,能够较好检测眼睛嘴唇特征形状,但是由于边缘不精确难以精确定位特征点,依赖初始参数大,容易陷入局部最小,计算时间长)(另外还有主动形状模型(ASM),主动表观模型(AAM))
4基于统计的方法(该方法的思想是将特征部位看做一类模式,然后使用大量的特征部位样本和非特征部位样本进行训练,然后构造分类器,该类方法主要有PCA(主成分分析)、SVM、ANN(神经网络)、AdaBoost、模板匹配)
5基于小波和小波包
5 机器学习的封装好的库:
这里有关于库的介绍:
theano:妹纸目前推荐我用这个库,python封装的。知乎上有不少人用这个,但是统一的评论是调试不方便。theano,教程比较基础,安装非常简单,几个指令可以搞定,不过用他来做开发实在太麻烦,建议配合keras使用,非常赞。
Theano   
Github网址:
还有一些库比如:matconvnet、Lasagne、opencv、nolearn、keras、caffe
最新的kaggle比赛中很多人用的是nolearn + lasagne,这两个库也是基于Theano作为核心建立的。&&
6 目前我的打算
我的目的:实现对人脸的关键点定位
学习思路:打算通过深度学习的方式来进行关键点检测,首先在ufldl上学习深度学习的入门知识,然后在网络的博客上找别人用python写的人脸检测的算法,最后自己基于C++实现,然后app中java调用。
比如链接:
访问:1904829次
积分:21851
排名:第402名
原创:102篇
转载:1380篇
评论:260条
个人邮箱: xuxiduo@zju.edu.cn
1)OpenCV俱乐部
2) 视频/音频/图像/算法/ML
备注:加群需要回答问题,避免广告党。
如果你是博客看到后加的,请注明“博客”并回答问题,只注明”博客“不回答问题的恕不加入。答案为和群相关的任何技术名词,不能出现1)和2)中的任何字眼
阅读:11206
文章:16篇
阅读:19309
阅读:11293
文章:32篇
阅读:65671
(1)(4)(4)(13)(4)(2)(24)(46)(6)(9)(8)(8)(31)(20)(18)(42)(70)(118)(143)(56)(68)(107)(226)(78)(3)(9)(37)(46)(50)(19)(15)(13)(27)(12)(12)(103)(18)(18)帖子很冷清,卤煮很失落!求安慰
手机签到经验翻倍!快来扫一扫!
各位大神,谁知道能不root就可以虚拟定位的软件或者方法吗?
109浏览 / 5回复
如题,不root就能够虚拟定位的方法是否有?我是android7.0,因为我想把微信虚拟定位。拜托各位了,知道的跟我说一下呗
热门排名: 第10名
很实在,一直再坚持
社区送温暖,茶水方沏好。快递组就位,倒数十五秒。 万事皆已备,开门查水表!
哇这个方式真是新颖别致,怎么就想不到呢→_→
先标记以后看
可能感兴趣的板块:
用户名/注册邮箱/注册手机号
其他第三方号登录Android人脸识别开发入门--基于虹软免费SDK实现 - 简书
Android人脸识别开发入门--基于虹软免费SDK实现
人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运用,例如刷脸打卡,刷脸APP,身份识别,人脸门禁等。当前的人脸识别技术分为WEBAPI和SDK调用两种方式,WEBAPI需要实时联网,SDK调用可以离线使用。
Android作为一个比较广泛的平台,如何实现人脸识别功能呢。
本文章将以一个示例的形式介绍一下我在这方面的经验。
本次使用的虹软提供的人脸识别的SDK,此SDK也可根据不同应用场景设计,针对性强。包括人脸检测、人脸跟踪、人脸识别,即使在离线环境下也可正常运行。
虹软公司是一家具有硅谷背景的图像处理公司,除了人脸技术以外,还有多项图像及视频处理技术。他们的双摄像头处理算法和人脸美化算法囊括了包括OPPO VIVO,SUMAMNG一系列手机厂商。
项目的目标
我们需要实现一个人脸识别功能。简单来说,就是机的后置摄像头,识别摄像头中实时拍到的人脸信息,如果人库注册过,则显示识别后的人脸信息,如登记的名字;如果不在,提示未注册。
这个功能具有多个应用场景,比如,火车站或者打卡和门禁系统中。
人脸识别的过程
人脸识别包括两个必备的过程,人脸注册和实时识别。
人脸注册是指把人脸的特征信息注册到人脸信息库中。人脸注册的来源可以有很多种,比如
国家身份证库
企业自建人脸识别库
互联网大数据库
人脸特征提取是一个不可逆的过程,你无法从人脸特征信息还原一个人的脸部照片。
在线库在使用时,需要传递照片信息,或者提取图像特征值,
离线的SDK相对安全,但是,在线的SDK通常提供更多的接入和调用方式,这个要结合实际情况来选择。
人脸注册和识别的过程可以用下面的图来表示。
在开发之前需要到虹软的官网
下载用到的android库,下载的压缩包中有3个压缩包,如下图:
其中,第一个Face Detection,人脸检测。
人脸检测是人脸技术的基础,使用虹软人脸引擎,能够帮助您检测并且定位到影像(图片或者视频)中的人脸。
第二个Face Recognition,
人脸识别。引擎可独立运行在终端设备或者独立服务器中,应用端可独立完成算法运行,能保证用户数据的私密性,自主运营与保护用户敏感信息。
第三个Face Tracking,
人脸跟踪。精确定位并追踪面部区域位置,随着人物脸部位置的变化能够快速定位人脸位置,并且适用于不同表情、性别、年龄、姿态、光照等条件。
这三包的结构基本相同,我们需要把它们解压。
doc 此目录中存放GUIDE文档,是说明文档,里面介绍了公开发布的一些API,并提供了示例代码。
libs 开发中需要用到的库,需要把它们目录结构不变的全部引用到你的项目项目中。
sampleCode 示例代码
注意:开发中还需要APP_Id和SDK_Key的激活码,这些激活码可以在账号管理--》您的申请记录,对应的下载应用中找到相应的激活码。
版本与环境要求
根据SDK的说明,我们使用的版本为android arm32,版本为5.0.我们使用的IDE为android studio,你也可以使用eclipse,不过依然建议你使用android studio,因为它现在已经是事实上的标准。
一步一步实现人脸识别功能
本文将以这三个库为基础,从人脸注册开始,到人脸识别结束。全程演示人脸识别的流程。如果你不想从头开始,你可以到 下载完整的示例程序
打开android studio,建立项目,API兼容性选择4.0。
导入依赖包
虹软人脸SDK的包是so包,你可以在下载的压缩包中把这些文件找到并导入。
导入后的工程文件夹如下所示。
定义并实现人脸库的相关功能
如前面所述,我们希望定义自己 的人脸库,人脸库在程序中使用List存储,在系统中保存为txt文件。
通过查询引擎,可以知道人脸信息是保存在AFR_FSDKFace类中的。这的主要结构为
public static final int FEATURE_SIZE = 22020;
byte[] mFeatureD
如果要进行人脸注册,我们需要定义另外一个类来把人脸信息和姓名关联起来。
class FaceRegist {
List&AFR_FSDKFace& mFaceL
public FaceRegist(String name) {
mFaceList = new ArrayList&&();
包含特征信息的长度和内容的byte数组。
我们把这些功能定义在类FaceDB中。FaceDB需要包含引擎定义,初始化,把人脸信息保存在版本库和从版本库中读出人脸信息这些功能
初始化引擎
为了程序结构性考虑,我们将人脸识别相关的代码独立出来一个类FaceDB,并定义必要的变量
public static String appid = "bCx99etK9Ns4Saou1EbFdC18xHdY9817EKw****";
public static String ft_key = "CopwZarSihp1VBu5AyGxfuLQdRMPyoGV2C2opc****";
public static String fd_key = "CopwZarSihp1VBu5AyGxfuLXnpccQbWAjd86S8****";
public static String fr_key = "CopwZarSihp1VBu5AyGxfuLexDsi8yyELdgsj4****";
String mDBP
List&FaceRegist& mR
AFR_FSDKEngine mFRE
AFR_FSDKVersion mFRV
定义有参数的构造函数来初始化引擎
public FaceDB(String path) {
mRegister = new ArrayList&&();
mFRVersion = new AFR_FSDKVersion();
mUpgrade =
mFREngine = new AFR_FSDKEngine();
AFR_FSDKError error = mFREngine.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key);
if (error.getCode() != AFR_FSDKError.MOK) {
Log.e(TAG, "AFR_FSDK_InitialEngine fail! error code :" + error.getCode());
mFREngine.AFR_FSDK_GetVersion(mFRVersion);
Log.d(TAG, "AFR_FSDK_GetVersion=" + mFRVersion.toString());
定义析构函数释放引擎占用的系统资源
public void destroy() {
if (mFREngine != null) {
mFREngine.AFR_FSDK_UninitialEngine();
实现人脸增加和读取功能
通常人脸库会存放在数据库中,本次我们使用List来进行简单的模拟,并将其保存在文本文件中,需要时从文本中读取,保存时写入到文件中。
我们使用addFace方法将待注册的人脸信息添加到人脸库中
void addFace(String name, AFR_FSDKFace face) {
//check if already registered.
boolean add =
for (FaceRegist frface : mRegister) {
if (frface.mName.equals(name)) {
frface.mFaceList.add(face);
if (add) { // not registered.
FaceRegist frface = new FaceRegist(name);
frface.mFaceList.add(face);
mRegister.add(frface);
if (!new File(mDBPath + "/face.txt").exists()) {
if (!saveInfo()) {
Log.e(TAG, "save fail!");
//save name
FileOutputStream fs = new FileOutputStream(mDBPath + "/face.txt", true);
ExtOutputStream bos = new ExtOutputStream(fs);
bos.writeString(name);
bos.close();
fs.close();
//save feature
fs = new FileOutputStream(mDBPath + "/" + name + ".data", true);
bos = new ExtOutputStream(fs);
bos.writeBytes(face.getFeatureData());
bos.close();
fs.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
使用loadFaces从文件中读取人脸
public boolean loadFaces(){
if (loadInfo()) {
for (FaceRegist face : mRegister) {
Log.d(TAG, "load name:" + face.mName + "'s face feature data.");
FileInputStream fs = new FileInputStream(mDBPath + "/" + face.mName + ".data");
ExtInputStream bos = new ExtInputStream(fs);
AFR_FSDKFace afr =
if (afr != null) {
if (mUpgrade) {
//upgrade data.
face.mFaceList.add(afr);
afr = new AFR_FSDKFace();
} while (bos.readBytes(afr.getFeatureData()));
bos.close();
fs.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
if (!saveInfo()) {
Log.e(TAG, "save fail!");
实现业务逻辑
实现人脸注册功能
人脸识别的前提条件就是人脸信息要先注册到人脸库中,注册人脸库
第一步当然是获取待注册的照片,我们可以可以使用摄像头,也可以使用照片。我们使用AlertDialog弹出选择框
new AlertDialog.Builder(this)
.setTitle("请选择注册方式")
.setIcon(android.R.drawable.ic_dialog_info)
.setItems(new String[]{"打开图片", "拍摄照片"}, this)
在对应的事件处理函数中进行处理
switch (which){
case 1://摄像头
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
ContentValues values = new ContentValues(1);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
mPath = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, mPath);
startActivityForResult(getImageByCamera, REQUEST_CODE_IMAGE_CAMERA);
case 0://图片
Intent getImageByalbum = new Intent(Intent.ACTION_GET_CONTENT);
getImageByalbum.addCategory(Intent.CATEGORY_OPENABLE);
getImageByalbum.setType("image/jpeg");
startActivityForResult(getImageByalbum, REQUEST_CODE_IMAGE_OP);
获取一张照片后,后续我们就需要实现人脸检测功能。
if (requestCode == REQUEST_CODE_IMAGE_OP && resultCode == RESULT_OK) {
mPath = data.getData();
String file = getPath(mPath);
//TODO: add image coversion
在上面的代码中,我们获取到了我们需要的图像数据bmp,把图片取出来
我们在Application类用函数 decodeImage中实现这段代码
public static Bitmap decodeImage(String path) {
ExifInterface exif = new ExifInterface(path);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
BitmapFactory.Options op = new BitmapFactory.Options();
op.inSampleSize = 1;
op.inJustDecodeBounds =
//op.inMutable =
res = BitmapFactory.decodeFile(path, op);
//rotate and scale.
Matrix matrix = new Matrix();
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
matrix.postRotate(90);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
matrix.postRotate(180);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
matrix.postRotate(270);
Bitmap temp = Bitmap.createBitmap(res, 0, 0, res.getWidth(), res.getHeight(), matrix, true);
Log.d("com.arcsoft", "check target Image:" + temp.getWidth() + "X" + temp.getHeight());
if (!temp.equals(res)) {
res.recycle();
} catch (Exception e) {
e.printStackTrace();
调用AFD_FSDK_StillImageFaceDetection返回检测到的人脸信息
人脸注册 ,首先要先检测出来人脸,对于静态图片,虹软人脸SDK中对应的是FD,提供了一个方法名称,叫AFD_FSDK_StillImageFaceDetection 。
我们来看一下参数列表
输入的图像数据
List&AFD_FSDKFace&
检测到的人脸会放到到该列表里。
注意AFD_FSDKFace对象引擎内部重复使用,如需保存,请clone一份AFD_FSDKFace对象或另外保存
AFD_FSDKFace是人脸识别的结果,定义如下
public class AFD_FSDKFace {
mRect定义一个了一个矩形框Rect
在此之前我们需要注意虹软人脸SDK使用的图像格式是NV21的格式,所以我们需要将获取到的图像转化为对应的格式。在Android_extend.jar中提供了对应的转换函数
byte[] data = new byte[mBitmap.getWidth() * mBitmap.getHeight() * 3 / 2];
ImageConverter convert = new ImageConverter();
convert.initial(mBitmap.getWidth(), mBitmap.getHeight(), ImageConverter.CP_PAF_NV21);
if (convert.convert(mBitmap, data)) {
Log.d(TAG, "convert ok!");
convert.destroy();
现在我们就可以调用AFD_FSDK_StillImageFaceDetection方法了
= engine.AFD_FSDK_StillImageFaceDetection(data, mBitmap.getWidth(), mBitmap.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result);
绘出人脸框
在List&AFD_FSDKFace&中保存了检测到的人脸的位置信息和深度信息。
我们可以将检测到的人脸位置信息在图片上用一个矩形框绘制出来表示检测到的人脸信息。
Canvas canvas = mSurfaceHolder.lockCanvas();
if (canvas != null) {
Paint mPaint = new Paint();
boolean fit_horizontal = canvas.getWidth() / (float)src.width() & canvas.getHeight() / (float)src.height() ? true :
float scale = 1.0f;
if (fit_horizontal) {
scale = canvas.getWidth() / (float)src.width();
dst.left = 0;
dst.top = (canvas.getHeight() - (int)(src.height() * scale)) / 2;
dst.right = dst.left + canvas.getWidth();
dst.bottom = dst.top + (int)(src.height() * scale);
scale = canvas.getHeight() / (float)src.height();
dst.left = (canvas.getWidth() - (int)(src.width() * scale)) / 2;
dst.top = 0;
dst.right = dst.left + (int)(src.width() * scale);
dst.bottom = dst.top + canvas.getHeight();
canvas.drawBitmap(mBitmap, src, dst, mPaint);
canvas.save();
canvas.scale((float) dst.width() / (float) src.width(), (float) dst.height() / (float) src.height());
canvas.translate(dst.left / scale, dst.top / scale);
for (AFD_FSDKFace face : result) {
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(10.0f);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawRect(face.getRect(), mPaint);
canvas.restore();
mSurfaceHolder.unlockCanvasAndPost(canvas);
将人脸注册到人脸库
检测到了人脸,我们可以输入相应的描述信息,加入到人脸库中。
为了提高识别的准确性,我们可以对一个人多次注册人脸信息。
void addFace(String name, AFR_FSDKFace face) {
//check if already registered.
boolean add =
for (FaceRegist frface : mRegister) {
if (frface.mName.equals(name)) {
frface.mFaceList.add(face);
if (add) { // not registered.
FaceRegist frface = new FaceRegist(name);
frface.mFaceList.add(face);
mRegister.add(frface);
if (!new File(mDBPath + "/face.txt").exists()) {
if (!saveInfo()) {
Log.e(TAG, "save fail!");
//save name
FileOutputStream fs = new FileOutputStream(mDBPath + "/face.txt", true);
ExtOutputStream bos = new ExtOutputStream(fs);
bos.writeString(name);
bos.close();
fs.close();
//save feature
fs = new FileOutputStream(mDBPath + "/" + name + ".data", true);
bos = new ExtOutputStream(fs);
bos.writeBytes(face.getFeatureData());
bos.close();
fs.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
最后,别忘记了销毁人脸检测引擎哦
err = engine.AFD_FSDK_UninitialFaceEngine();
Log.d("com.arcsoft", "AFD_FSDK_UninitialFaceEngine =" + err.getCode());
实现人脸识别
上面的代码准备完毕后,就可以开始我们的人脸识别的功能了。我们使用一个第三方的扩展库,ExtGLSurfaceView的扩展 库CameraGLSurfaceView,用ImageView和TextView显示检测到的人脸和相应的描述信息。
首先是定义layout。
&?xml version="1.0" encoding="utf-8"?&
&RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" &
&com.guo.android_extend.widget.CameraSurfaceView
android:id="@+id/surfaceView"
android:layout_width="1dp"
android:layout_height="1dp"/&
&com.guo.android_extend.widget.CameraGLSurfaceView
android:id="@+id/glsurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"/&
&ImageView
android:id="@+id/imageView"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"/&
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/imageView"
android:layout_alignRight="@+id/imageView"
android:layout_below="@+id/imageView"
android:layout_marginTop="10dp"
android:text="@string/app_name"
android:textAlignment="center"/&
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/imageView"
android:layout_alignRight="@+id/imageView"
android:layout_below="@+id/textView"
android:layout_marginTop="10dp"
android:text="@string/app_name"
android:textAlignment="center"/&
&/RelativeLayout&
因为引擎需要的图像格式是NV21的,所以需要将摄像头中的图像格式预设置为NV21
public Camera setupCamera() {
// TODO Auto-generated method stub
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mWidth, mHeight);
parameters.setPreviewFormat(ImageFormat.NV21);
for( Camera.Size size : parameters.getSupportedPreviewSizes()) {
Log.d(TAG, "SIZE:" + size.width + "x" + size.height);
for( Integer format : parameters.getSupportedPreviewFormats()) {
Log.d(TAG, "FORMAT:" + format);
List&int[]& fps = parameters.getSupportedPreviewFpsRange();
for(int[] count : fps) {
Log.d(TAG, "T:");
for (int data : count) {
Log.d(TAG, "V=" + data);
mCamera.setParameters(parameters);
} catch (Exception e) {
e.printStackTrace();
if (mCamera != null) {
mWidth = mCamera.getParameters().getPreviewSize().
mHeight = mCamera.getParameters().getPreviewSize().
从摄像头识别人脸,需要使用FT库,FT库在人脸跟踪算法上对人脸检测部分进行了优化,是专门为视频处理而优化的库。
初始化人脸检测引擎(FT)
和FD一样,我们需要初始化人脸识别FT引擎。
Log.d(TAG, "AFT_FSDK_InitialFaceEngine =" + err.getCode());
err = engine.AFT_FSDK_GetVersion(version);
Log.d(TAG, "AFT_FSDK_GetVersion:" + version.toString() + "," + err.getCode());
在摄像头的预览事件处理函数中,先调用FT的人脸识函数函数,然后再调用FR中的人脸信息特征提取数函数。
AFT_FSDKError err = engine.AFT_FSDK_FaceFeatureDetect(data, width, height, AFT_FSDKEngine.CP_PAF_NV21, result);
AFR_FSDKError error = engine.AFR_FSDK_ExtractFRFeature(mImageNV21, mWidth, mHeight, AFR_FSDKEngine.CP_PAF_NV21,mAFT_FSDKFace.getRect(), mAFT_FSDKFace.getDegree(), result);
这里面的result中保存了人脸特征信息。我们可以将其保存下来或下来并与系统中的其它信息进行对比。
AFR_FSDKMatching score = new AFR_FSDKMatching();
float max = 0.0f;
String name =
for (FaceDB.FaceRegist fr : mResgist) {
for (AFR_FSDKFace face : fr.mFaceList) {
error = engine.AFR_FSDK_FacePairMatching(result, face, score);
Log.d(TAG,
"Score:" + score.getScore() + ", AFR_FSDK_FacePairMatching=" + error.getCode());
if (max & score.getScore()) {
max = score.getScore();
name = fr.mN
当score的特征信息大于0.6时,我们就可以认为匹配到了人脸。显示人脸匹配信息。
上面的循环中,可以看到,是遍历了真个库进行寻找。我们的目的是为了演示,实际情况下,我们可以在找到一个匹配值比较高的人脸后,就跳出循环。
我们来看一下运行的结果。
效果还不错吧。钟汉良帅哥一枚。
本文档中所有的代码都可以在 下载。如果你需要寻找更多的人脸识别的demo,也可以到虹软的论坛中去寻找。
附录:会遇到的问题及解决方案
如果你使用的是github中的示例,你可能会遇到下面的问题。
Plugin with id 'com.android.application' not found
直接从github上下载的源代码会有这个问题。
解决方案:打开 [项目文件夹]\app\build.gradle 文件
在文件末尾添加
buildscript {
repositories {
mavenCentral()
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
to find build tools revision 25.0.0.2
这个主要是build 的版本和gradle中指定的版本不一致,按照提示下载或者修改版本指定就可以了。
compileSdkVersion 24
buildToolsVersion "25.0.2"
install_failed_no_maching_abis
下载的代码在gradle编译完成后,直接默认运行会出现这个错误。原因是由于使用了native libraries 。该native libraries 不支持当前的cpu的体系结构。
首先请检查是否导入了必要的so文件。一共需要导入四个.so文件。
另外,请确认使用是的真机调试。因为调用了摄像头,请使用真机调试。
人脸识别是当前的热点技术,使用范围广,用户体验良好,对硬件的依赖低,不需要昂贵的传感器芯片。一个高清的摄像头就可以完成。以前的成本是人脸识别的SDK比较贵,但现在虹软的SDK免费之后,集成的成本就大大降低了。
大企业中的小程序
引言 人脸识别当前比较热门的技术,作为开发者的我们,如果不实现人脸识别的功能就太Low了,从头开始发明轮子不可取,我们可以用很多现成的人脸识别技术来实现。当前的人脸识别技术分为WEBAPI和SDK调用两种方式,WEBAPI需要实时联网,SDK调用可以离线使用。 本次我们使用...
在上篇文章中我们提到了人脸识别的想法,并且下载到了虹软免费的人脸识别的SDK,然后发现它是C++版本的,经过了一番百度之后发现原来C#可以使用P/Invoke的方式来操作C++的DLL的,而且相当方便。我们今天就来实现它。 项目目标 我们希望先实现我们的简单的Hello W...
虹软官网:http://www.arcsoft.com.cn 论坛:http://www.arcsoft.com.cn/bbs/forum.php?mod=forumdisplay&fid=59 创建App:http://www.arcsoft.com.cn/ai/sdk/...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
突然发现我满脑子都是成长,行动还跟不上,应了那句话:想的很多,做的很少。当然,这不是主题。似乎总是很忙碌的样子,总是把事情安排的满满的,至于是不是都那么起作用,我就没考虑过了。就认准一句话。先做再说,好吧,现在能说了,是不是都起了作用,是不是又贪图了形式,是不是能删减掉了?...
大概两年前,冬天,我们同一天回学校,但不同航班,她在机场等了我好几个小时,我到时已经是晚上八点多。 从银川河东机场到石嘴山大武口区,三个多小时的夜车,大巴,的士,大巴,的士,她一路上都在讲一本你假期看到的小说,何以琛,赵默笙...完全陌生的名字,对我来说足够狗血的剧情,我有...
图片发自简书App 01 两次打击 最近感受到受到了两次小小打击。一个来自90后牛人杨坤龙,一个是来自简书的“爱读书的高博士”。 因为写作的水平感觉不到提升,阅读量也没有什么起色。于是我开始开始学习有关网络上别人推荐的课程。比如前几天弗兰克推荐的杨坤龙的公众号运营课;开始研...
连续几周过得很精彩,工作上的事情,迂迂回回地绕。有时候明明已经用尽全身力气,结果还是不尽如人意,推不动的事情,只能放下来,再次退回到自己的位置,等待时机。 这周跟两位信仰基督教的同事聊天,在两个不同地场合和主题,她们都提到了同样一句话:因为人是很渺小的,很多事情我们没办法掌...
深情如果是错付,就一毛不值。

我要回帖

更多关于 虚拟人脸 的文章

 

随机推荐