Android是不是无法实现多张openface实现人脸识别别

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
在Android实现人脸识别的详细过程
摘要:&照相时,在预览画面上提示用户人脸的位置,并完成自动对焦等,是个错的应用;下面是实现细节我们知道在android的代码中已有人脸识别的底层算法代码,而且在framework层也封了调用的API函数&&&&extern/neven目录下是实现人脸识别的算法代码。添加获取照相时预览图片数据,可以在onPreviewFrame回调函数中得。在开始预览的地方,用mCameraDevice.setPreviewCallback(mPre
&照相时,在预览画面上提示用户人脸的位置,并完成自动对焦等,是个错的应用; 下面是实现细节
我们知道在android的代码中已有人脸识别的底层算法代码,而且在framework层也封了调用的API函数
&&&& extern/neven 目录下是实现人脸识别的算法代码。添加获取照相时预览图片数据,可以在onPreviewFrame回调函数中得。在开始预览的地方,用mCameraDevice.setPreviewCallback(mPreviewCallback);设置预览回调函数。import android.media.FaceDimport android.media.FaceDetector.F
&//Harrison add&private void DrawRectOnFace() {& if (numberOfFaceDetected != 0) {&& Face mFace1 = mFace[0];&& PointF midPoint = new PointF();&& mFace1.getMidPoint(midPoint);&&&& if ((Math.abs(mPreMidPoint.x-midPoint.x) & 50) &;&; (Math.abs(mPreMidPoint.y-midPoint.y) & 50)) {&&& Log.i(&Harrison&, &not draw Rect .&);&&&&& }&& mPreMidPoint.x = midPoint.x;&& mPreMidPoint.y = midPoint.y;&& mFindFaceView.setVisibility(View.VISIBLE);& } else {&& mPreMidPoint.x = 0;&& mPreMidPoint.y = 0;&& mFindFaceView.clearDraw();&& mFindFaceView.setVisibility(View.GONE);&&& }& mFindFaceView.drawRects(mFace, numberOfFaceDetected);&}
//调用API找人脸,需要import进软件包哦!
&private void FindFacesInBitmap(Bitmap myBitmap) {& imageWidth = myBitmap.getWidth();& imageHeight = myBitmap.getHeight();& Log.i(&Harrison&, &imageWidth=&+imageWidth+&,& imageHeight=&+imageHeight);& mFace = new FaceDetector.Face[numberOfFace];& mFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);& numberOfFaceDetected = mFaceDetect.findFaces(myBitmap, mFace);& Log.i(&Harrison&, &numberOfFaceDetected=&+numberOfFaceDetected);&}
&private Bitmap rotateMyBitmap(Bitmap bitmap) {
& int width = bitmap.getWidth();&& int height = bitmap.getHeight();&
& Matrix matrix = new Matrix();&& matrix.postRotate(90); //椤烘杞?0搴EUR?
& Bitmap rotateBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);&& return rotateB&}
&private Bitmap scaleMyBitmap(Bitmap bitmap) {
& int width = bitmap.getWidth();&& int height = bitmap.getHeight();&&&& int nWidth = mFindFaceView.getFaceViewWidth();;&& int nHeight = mFindFaceView.getFaceViewHeight();&&&// Log.i(&Harrison&, &nWidth=&+nWidth+&,& nHeight&+nHeight);&&& float scaleWidth = ((float) nWidth)/&&& float scaleHeight = ((float)nHeight)/&&& Matrix matrix = new Matrix();&& matrix.postScale(scaleWidth, scaleHeight);&&& Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);&& return resizedB&}
//处理图片格式,一般摄像头抓到的数据为ImageFormat.NV21,不同的格式,需要调整的。
&private void decodeToBitMap(byte[] data, android.hardware.Camera _camera) {& mCameraDevice.setPreviewCallback(null);& Size size = mCameraDevice.getParameters().getPreviewSize();& //FileOutputStream outStream =& try {&& YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
&& if (image != null) {&&& ByteArrayOutputStream stream = new ByteArrayOutputStream();&&& image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
& //& outStream = new FileOutputStream(String.format(&/sdcard/%d.jpg&, System.currentTimeMillis()));& //& outStream.write(stream.toByteArray());& //& outStream.close();& //& Log.i(&Harrison&, &write file to sdcard.&);
//在我的手机上有两种预览模式,发现全屏模式时需要调整图片的大小才能正确定位。
&&& Bitmap myBitmap=BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());&&&& stream.close();&&& if (mPreviewLayoutProxy.getFullScreenMode()) { // fullscreen mode&&&& Bitmap tmpScaleBmp=&&&& Bitmap tmpRotateBmp=
//手机是竖屏横排是与其别的哦&&&& if (((mOrientation/90) == 0) || ((mOrientation/90) == 2)) {&&&&&& tmpRotateBmp = rotateMyBitmap(myBitmap);&&&&& tmpScaleBmp = scaleMyBitmap(tmpRotateBmp);&&&&& FindFacesInBitmap(tmpScaleBmp);&&&&& if (tmpRotateBmp != null) {&&&&&& tmpRotateBmp.recycle();&&&&&& tmpRotateBmp =&&&&& }&&&& } else {&&&&& FindFacesInBitmap(scaleMyBitmap(myBitmap));&&&& }&&&& if (tmpScaleBmp != null) {&&&&& tmpScaleBmp.recycle();&&&&& tmpScaleBmp =&&&& }&&& } else { //normal mode&&&& FindFacesInBitmap(myBitmap);&&& }&&& DrawRectOnFace();&&& if (myBitmap != null) {&&&& myBitmap.recycle();&&&& myBitmap =&&& }&& }& } catch (Exception ex) {&& Log.e(&Sys&, &Error:& + ex.getMessage());& }& mCameraDevice.setPreviewCallback(mPreviewCallback);&}&&private& final class PostPreviewCallback implements PreviewCallback {& @Override& public void onPreviewFrame(byte[] data, android.hardware.Camera camera) {
&&&& decodeToBitMap(data, camera);&& }&}&
我们知道,相机预览是用 SurfaceView来显示图片的;在我们画提示框时,不能直接用那个view的,会出现黑屏的状态,预览的画面也不流畅的。
添加一个一样大小的SurfaceView来提示。
在xml布局中添加
&&SurfaceView android:id=&@+id/camera_preview&&&&&&&&&&&&&&&&&&&& android:layout_width=&match_parent&&&&&&&&&&&&&&&&&&&& android:layout_height=&match_parent&/&&& &!-- Harrison add finding faces Rectangle--&&& &com.android.camera.FindFaceView&&& android:id=&@+id/faces_rectangle&&&&&&&& android:layout_width=&fill_parent&&&&& android:layout_height=&fill_parent& /&&& &!-- end add
我的画提示框代码:
package com.android.
import android.content.Cimport android.graphics.Cimport android.graphics.Bimport android.graphics.Cimport android.graphics.Pimport android.graphics.Rimport android.graphics.Paint.Simport android.graphics.PixelFimport android.graphics.PorterDuffXimport android.graphics.PorterDimport android.util.AttributeSimport android.util.Limport android.view.SurfaceHimport android.view.SurfaceVimport android.view.Vimport android.graphics.PointF;import android.media.FaceDimport android.media.FaceDetector.F
public class FindFaceView extends SurfaceView implements SurfaceHolder.Callback{
&protected SurfaceH&private& SurfaceHolder mCameraSh;&private int mW&private int mH&private float mEyesD
&public FindFaceView(Context context, AttributeSet attrs) {& super(context, attrs);& // TODO Auto-generated constructor stub& sh = getHolder();& sh.addCallback(this);& sh.setFormat(PixelFormat.TRANSPARENT);& setZOrderOnTop(true);&}
&public void surfaceChanged(SurfaceHolder arg0, int arg1, int w, int h) {& // TODO Auto-generated method stub& mWidth =& mHeight =&}
&public void surfaceCreated(SurfaceHolder arg0) {& // TODO Auto-generated method stub
&public void surfaceDestroyed(SurfaceHolder arg0) {& // TODO Auto-generated method stub
&void setCameraPreviewSurfaceHolder(SurfaceHolder& sh) {& mCameraSh =&}&public int getFaceViewWidth() {& return mW&}&public int getFaceViewHeight() {& return mH&}
&void clearDraw() {& Canvas canvas = sh.lockCanvas();& Paint clipPaint = new Paint();& clipPaint.setAntiAlias(true);& clipPaint.setStyle(Paint.Style.STROKE);& clipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));& canvas.drawPaint(clipPaint);& sh.unlockCanvasAndPost(canvas);&}&&&& public void drawRects(FaceDetector.Face[] mFace, int numberOfFaceDetected) {& Canvas canvas = sh.lockCanvas();
& Paint clipPaint = new Paint();& clipPaint.setAntiAlias(true);& clipPaint.setStyle(Paint.Style.STROKE);& clipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));& canvas.drawPaint(clipPaint);&& canvas.drawColor(Color.TRANSPARENT);& Paint p = new Paint();& p.setAntiAlias(true);& p.setColor(Color.RED);& p.setStyle(Style.STROKE);
& for (int i = 0; i & numberOfFaceD i++) {&//& if (0 == i) {&//&& p.setColor(Color.WHITE);&//& } else {&//&& p.setColor(Color.GRAY);&//& }&& Face face = mFace[i];&& PointF myMidPoint = new PointF();&& face.getMidPoint(myMidPoint);&& mEyesDistance = face.eyesDistance();&& Log.i(&Harrison&, &i=&+i+&(&+myMidPoint.x+&, &+myMidPoint.y+&)&);&& canvas.drawRect((int)(myMidPoint.x-mEyesDistance),&&&& (int)(myMidPoint.y-mEyesDistance),&&&& (int)(myMidPoint.x+mEyesDistance),&&&& (int)(myMidPoint.y+mEyesDistance),&&&& p);& }& sh.unlockCanvasAndPost(canvas);& }
//测试两个View是否错移&public void drawBitmap(Bitmap myBitmap) {& Canvas canvas = sh.lockCanvas();& canvas.drawBitmap(myBitmap, 0, 0, null);& sh.unlockCanvasAndPost(canvas);&// mImage.setImageBitmap(myBitmap);&// mImage.invalidate();&}&public void doDraw() {& Canvas canvas = sh.lockCanvas();& canvas.drawColor(Color.TRANSPARENT);// 这里是绘制背景& Paint p = new Paint(); // 笔触& p.setAntiAlias(true); // 反锯齿& p.setColor(Color.RED);& p.setStyle(Style.STROKE);& canvas.drawLine(mWidth/2 - 100, 0, mWidth/2 - 100, mHeight, p);& canvas.drawLine(mWidth/2 + 100, 0, mWidth/2 + 100, mHeight, p);& // ------------------------& // 画边框---------------------& Rect rec = canvas.getClipBounds();& rec.bottom--;& rec.right--;& p.setColor(Color.GRAY);& // 颜色& p.setStrokeWidth(5);& canvas.drawRect(rec, p);& // 提交绘制& sh.unlockCanvasAndPost(canvas);&}}遇到一个问题,在预览时频繁的全屏普通切换,容易粗出现识别库无效。请高手指点指点。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
在Android实现人脸识别的详细过程相关信息,包括
的信息,所有在Android实现人脸识别的详细过程相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International《人脸解锁》 看Android到底有多智能
随着科技发展,人体密码已经被越来越多的使用到现实生活中。经常看电影中的出现指纹、视网膜、面部识别等功能,科技总是能带给我们一个个惊喜。今天小编向大家介绍的这款软件就是可以通过面部识别来锁定程序,最大限度保护用户手机私密的APP——FaceLock for apps Pro(人脸识别)。软件名称:人脸解锁 FaceLock for apps Pro 文件大小:6.613MB 软件版本:2.6.4 语言种类:英文 系统支持:Android 2.3及以上
软件使用 这个应用还是挺有新鲜感的,通过拍摄至少7张常用角度的脸部照片来进行记录,从而锁定应用程序和屏幕。虽然锁定后脸部有可能不被识别。 但也不必担心,在你设定人脸之前系统会提醒你再设定数字或拼音密码,没有输入密码的话也没办法应用脸部解锁工具,所以如果人脸解锁不可用,通过输入密码也是可行的。
可以使用脸部锁定任何应用程序、锁屏屏幕替换、图案锁的设定等等。看来照片识别不敏感,不靠谱。小编担心的是这样很大一部分美眉只有在早上上妆后才能使用了。
小编点评 人脸解锁FaceLock for apps Pro是一款基于面部识别来解锁经过保护的应用程序,照片识别功能不靠谱的话可以把它当成简单的锁定程序来用,毕竟它的应用范围比自带的程序锁范围广。试了一下确实可以锁定程序,但人脸识别效率不是很高,用起来稍显惊险,如果是用来解锁屏幕的话,很可能会让一些用户抓狂。
分享给你的圈子
来源: 手机之家
热门手机排行榜
imobile.com.cn 手机之家 所有权利保留京ICP备号&京ICP证090349号&电信业务审批[2009]字第281号&京公网安备:关于opencv的人脸识别的Demo配置(android端不需要Manager) - 简书
关于opencv的人脸识别的Demo配置(android端不需要Manager)
相信各位再开发中经常会用到人脸识别的技术,opencv是其中的一种实现方案,但是需要精通NDK,不然光是配置都搞死一堆人,不啰嗦了。第一步:去官网下载:https://sourceforge.net/projects/opencvlibrary/files/opencv-android/3.2.0/opencv-3.2.0-android-sdk.zip/download第二步:解压后创建一个androidProject
接着下一步下一步,记得异常支持的两个勾勾上第三步:点击File-&importModule(选择你下载的Opencv-android-sdk)目录下sdk/java,点击Ok
第四步:再把导入的类库添加依赖,我导入的这里项目叫app
第五步:5.1,samples目录下的face-detection中的src复制到app这个项目的src下(把系统生成的删除)5.2,导入layout,和raw5.3,把jni目录下的DetectionBasedTracker_jni.cpp和DetectionBasedTracker_jni.h拷贝到cpp目录下,5.4,在main目录下新建jniLibs目录,在jniLibs下新建armeabi,再sdk/native/libs/armeabi目录下的libopencv_java3.so,拷贝到新建的jniLibs目下的armeabi,5.5,将sdk/native/jni/include文件下的所有东西,全部考入到jniLibs目录下。完成后的结构如下图
第六步:在CMakeList.txt文件中写入(原来文件中的全部删除,复制粘贴下面的即可,这是NDK的配置,在这里就不多解释,老司机一看就明白)# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.4.1)# Creates and names a library, sets it as either STATIC# or SHARED, and provides the relative paths to its source code.# You can define multiple libraries, and CMake builds them for you.# Gradle automatically packages shared libraries with your APK.add_library(opencv_java3SHAREDIMPORTED)set_target_properties(opencv_java3PROPERTIES IMPORTED_LOCATION../../../../src/main/jniLibs/armeabi/libopencv_java3.so)#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")if(CMAKE_COMPILER_IS_GNUCXX)set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")message(STATUS "optional:-std=c++11")endif(CMAKE_COMPILER_IS_GNUCXX)include_directories(src/main/jniLibs/include)add_library( # Sets the name of the library.detection_based_tracker# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).src/main/cpp/DetectionBasedTracker_jni.cpp )# Searches for a specified prebuilt library and stores the path as a# variable. Because CMake includes system libraries in the search path by# default, you only need to specify the name of the public NDK library# you want to add. CMake verifies that the library exists before# completing its build.find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log )# Specifies libraries CMake should link to your target library. You# can link multiple libraries, such as libraries you define in this# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.detection_based_tracker opencv_java3# Links the target library to the log library# included in the NDK.${log-lib} )第七步:在build-gradle文件中加入,接着同步一下,检查是否报错(记得加相机权限哟)
第八步:记得运行成功后是需要添加Manager的,但是按照下面做就不需要了(最重要一步)。8.1在加载类库的前面加上
8.2并且注释掉
在点击运行,这次就不需要Manager了,记得没有申请运行时权限的请在应用管理中打开哟,至于,相机全屏的,请参考它的demo,确实不会就复制它的AndroidManifest.xml文件到覆盖你自己的就行。第一次写文章,老司机和大神们多多关照。
-------------------------demo链接待补。。。。 在Android Studio中有3种方法生成so文件。 最初的时候,我曾经使用过Visual Studio生成so文件。经历了从入门到放弃的过程。。。。 1.通过mk文件和gradle。 //这种...
developer.android.com/studio/projects/add-native-code.html 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运行示例应用 向现有项目添加 C/C++ 代码 创建新的原生源文件 创建 CMak...
Ubuntu NDK环境配置和makefile语法及其使用 1 Ubuntu NDK环境配置 下载NDK安装程序Goggle官方链接:http://developer.android.com/intl/zh-cn/ndk/downloads/index.html#downl...
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI的开发,以及涉及到的NDK相关的操作。当然,本篇仍是以Eclipse作为开...
最近有关北京房价的话题又一次被舆论讨论到一个小高潮。不管是微信朋友圈还是微博长图片,都在不停地转发一篇叫《最近有点为北京感到难过》的文章。 文章讲的是作者的同事在北京奋斗了10年,不堪生活的重压最终卖了房回老家。此外还讲了北漂一族普遍存在的焦虑,无奈和心酸。 从作者的表述来...
我想念着你 做了一场梦 一场虚无缥缈的梦 在梦中
我坐在纸船上 而船
漂浮在水面上 摇晃着 驶向遥远的彼岸
彼岸的你 是否也在痴情的望着我吗? 我怀着激动而又喜悦的心情 驶向有你的彼岸 但是
我失望而归 在海的那边 没有你的身影 也许
梦境到了尽头才发觉 并不是...
这几年,随着空调行业的日趋成熟,市面上涌现出了一大批有别于传统空调的新式中央空调,这些新式的中央空调不仅外形美观大气,节约空间,在功能上也不再仅仅局限于制冷制热,更大限度的满足了人们的多种需求,真正适应了现代社会人们对于高品质生活的追求!那么,中央空调厂家究竟哪家好呢,下面...
这本看起来像整理术、收纳法的畅销书籍,原来是一本心灵疗愈法。扔掉一些不需要的东西,不适合自己的东西,当下不需要的东西,展开全新的人生。 如今的确有许多人都被不属于自己的东西束缚着,不喜欢的工作、已经消耗殆尽的爱情、不得不承担的家庭责任、一些无法放手的开心事或不开心的事,对未...
我也曾哭泣, 我也会落泪。 可是, 又有什么用? 于是, 我和魔鬼做了个交易。求助大神帮忙,android中两张人脸比对相似度怎么实现
[问题点数:40分]
求助大神帮忙,android中两张人脸比对相似度怎么实现
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|android上实现人脸识别的功能
[问题点数:100分,结帖人Beyond0525]
android上实现人脸识别的功能
[问题点数:100分,结帖人Beyond0525]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年1月 移动平台大版内专家分月排行榜第二2012年12月 移动平台大版内专家分月排行榜第二
2014年1月 移动开发大版内专家分月排行榜第三2013年4月 移动平台大版内专家分月排行榜第三2013年3月 移动平台大版内专家分月排行榜第三2012年6月 移动平台大版内专家分月排行榜第三
匿名用户不能发表回复!|

我要回帖

更多关于 android实现人脸识别 的文章

 

随机推荐