Android人脸识别技术,可以参考下面的网站。

http://www.faceplusplus.com.cn/

本项目使用的就是该网站的api.

项目具体使用的技术代码

/**
* 用来压缩图片的方法
*/
private void resizePhoto() {
BitmapFactory.Options options = new Options();
options.inJustDecodeBounds = true; BitmapFactory.decodeFile(mcurrentPhotoPath, options); double ratio = Math.max(options.outWidth*1.0d/1024 , options.outHeight*1.0d/1024); options.inSampleSize = (int)Math.ceil(ratio); options.inJustDecodeBounds = false; mphotoImage = BitmapFactory.decodeFile(mcurrentPhotoPath, options);
}
//开启图库
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PIC_CODE);
得到图片位置
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch(requestCode) {
//获取图片的路径
case PIC_CODE:
if(null != intent) {
Uri uri = intent.getData();
Cursor cursor = getContentResolver().query( uri, null, null, null, null);
if (cursor==null) {
Log.e("M", "null");
}
cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
mcurrentPhotoPath = cursor.getString(idx);
cursor.close(); resizePhoto(); photoView.setImageBitmap(mphotoImage);
num_detected.setText("");
}
break;

不装逼了,贴代码。

Mainactivity.class

package com.crazylin.facedetected;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView; import com.facepp.error.FaceppParseException; public class MainActivity extends Activity implements OnClickListener {
private static final int PIC_CODE = 0X110;
private Button getImage_btn, image_detect_btn, capture_btn;
private View loadingView;
private ImageView photoView;
private TextView num_detected;
private String mcurrentPhotoPath;
private Bitmap mphotoImage;
private Handler mhandler;
private Paint mPaint;
private TextView infoText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
setContentView(R.layout.activity_main); initView();
initEvent(); initHandler();
mPaint = new Paint(); } private void initHandler() {
mhandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case RESULT_OK:
loadingView.setVisibility(View.GONE);
JSONObject json = (JSONObject) msg.obj;
prepareResultBitmap(json);
photoView.setImageBitmap(mphotoImage);
break;
case RESULT_CANCELED:
loadingView.setVisibility(View.GONE);
String errorMessage = (String) msg.obj; if(TextUtils.isEmpty(errorMessage)) {
num_detected.setText("Error");
}else {
num_detected.setText(errorMessage);
}
break;
}
} };
} private void prepareResultBitmap(JSONObject json) {
Bitmap bitmap = Bitmap.createBitmap(mphotoImage.getWidth(), mphotoImage.getHeight(), mphotoImage.getConfig());
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(mphotoImage, 0, 0, null);
try {
JSONArray faces = json.getJSONArray("face");
int faceCount = faces.length();
num_detected.setText("find : " + faceCount); for(int i=0; i<faceCount; i++) {
//单独的face对象
JSONObject face = faces.getJSONObject(i); int age = face.getJSONObject("attribute").getJSONObject("age").getInt("value");
String gender = face.getJSONObject("attribute").getJSONObject("gender").getString("value");
//String race = face.getJSONObject("attribute").getJSONObject("race").getString("value"); Bitmap infoBitmap = BuildBitmapInfo(age, gender); int infoWidth = infoBitmap.getWidth();
int infoHeight = infoBitmap.getHeight(); if((bitmap.getWidth() < photoView.getWidth())&&(bitmap.getHeight() < photoView.getHeight())) {
float ratio = Math.max(bitmap.getWidth()*1.0f/photoView.getWidth(), bitmap.getHeight()*1.0f/photoView.getHeight());
infoBitmap = Bitmap.createScaledBitmap(infoBitmap, (int)(infoWidth * ratio), (int)(infoHeight * ratio), false);
} JSONObject position = face.getJSONObject("position");
float x = (float) position.getJSONObject("center").getDouble("x");
float y = (float) position.getJSONObject("center").getDouble("y"); float w = (float) position.getDouble("width");
float h = (float) position.getDouble("height"); x = x/100*bitmap.getWidth();
y = y/100*bitmap.getHeight(); w = w/100*bitmap.getWidth();
h = h/100*bitmap.getHeight(); mPaint.setColor(0xffffffff);
canvas.drawLine(x - w/2, y - h/2, x - w/2, y + h/2, mPaint);
canvas.drawLine(x - w/2, y - h/2, x + w/2, y - h/2, mPaint);
canvas.drawLine(x + w/2, y - h/2, x + w/2, y + h/2, mPaint);
canvas.drawLine(x - w/2, y + h/2, x + w/2, y + h/2, mPaint); canvas.drawBitmap(infoBitmap, x - infoBitmap.getWidth()/2, y - h/2 - infoBitmap.getHeight(), null); mphotoImage = bitmap; }
} catch (JSONException e) {
e.printStackTrace();
}
} private Bitmap BuildBitmapInfo(int age, String gender) {
System.out.println(gender + " age:" + age);
infoText.setText(gender + " age:" + age );
infoText.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(infoText.getDrawingCache());
infoText.destroyDrawingCache();
return bitmap;
} private void initEvent() {
getImage_btn.setOnClickListener(this);
image_detect_btn.setOnClickListener(this);
capture_btn.setOnClickListener(this);
} private void initView() {
getImage_btn = (Button) findViewById(R.id.get_image);
image_detect_btn = (Button) findViewById(R.id.detect_image);
capture_btn = (Button) findViewById(R.id.capture_image);
loadingView = findViewById(R.id.loading);
photoView = (ImageView) findViewById(R.id.photo_image);
num_detected = (TextView) findViewById(R.id.num_detected);
infoText = (TextView) findViewById(R.id.info_text); } @Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch(requestCode) {
//获取图片的路径
case PIC_CODE:
if(null != intent) {
Uri uri = intent.getData();
Cursor cursor = getContentResolver().query( uri, null, null, null, null);
if (cursor==null) {
Log.e("M", "null");
}
cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
mcurrentPhotoPath = cursor.getString(idx);
cursor.close(); resizePhoto(); photoView.setImageBitmap(mphotoImage);
num_detected.setText("");
}
break;
case 2:
Bitmap bmPhoto = (Bitmap) intent.getExtras().get("data");
mcurrentPhotoPath = "capturing";
mphotoImage = bmPhoto;
photoView.setImageBitmap(mphotoImage);
num_detected.setText("");
break;
}
} /**
* 用来压缩图片的方法
*/
private void resizePhoto() {
BitmapFactory.Options options = new Options();
options.inJustDecodeBounds = true; BitmapFactory.decodeFile(mcurrentPhotoPath, options); double ratio = Math.max(options.outWidth*1.0d/1024 , options.outHeight*1.0d/1024); options.inSampleSize = (int)Math.ceil(ratio); options.inJustDecodeBounds = false; mphotoImage = BitmapFactory.decodeFile(mcurrentPhotoPath, options);
} @Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.get_image:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PIC_CODE);
break; case R.id.capture_image:
Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent2, 2);
break;
case R.id.detect_image:
loadingView.setVisibility(View.VISIBLE);
if(mcurrentPhotoPath!=null && !mcurrentPhotoPath.trim().equals("")) {
if(mcurrentPhotoPath.equals("capturing")) { }else {
resizePhoto();
}
}else {
mphotoImage = BitmapFactory.decodeResource(getResources(), R.drawable.brother2);
} FaceDetect.detect(mphotoImage, new FaceDetect.Callback() {
@Override
public void success(JSONObject result) {
Message msg = Message.obtain(mhandler);
msg.what = RESULT_OK;
msg.obj = result;
msg.sendToTarget();
} @Override
public void error(FaceppParseException exception) {
Message msg = Message.obtain(mhandler);
msg.what = RESULT_CANCELED;
msg.obj = exception.getErrorMessage();
msg.sendToTarget();
}
});
break;
} } } </code></pre>

mainactivity的对应布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" > <Button
android:id="@+id/get_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:text="Get Image" /> <Button
android:id="@+id/detect_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginRight="10dp"
android:layout_toLeftOf="@+id/get_image"
android:text="Detect" /> <TextView
android:id="@+id/num_detected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginRight="10dp"
android:layout_toLeftOf="@+id/detect_image"
android:layout_alignTop="@+id/detect_image"
android:gravity="center"
android:text="find: 0" /> <ImageView
android:id="@+id/photo_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/detect_image"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:src="@drawable/brother2"/> <FrameLayout
android:id="@+id/loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:visibility="gone">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/> <TextView
android:id="@+id/info_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:textColor="#AEEEEEff"
android:layout_gravity="center"
android:textSize="18sp"
android:text=" "
/> </FrameLayout> <Button
android:id="@+id/capture_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/num_detected"
android:layout_alignBottom="@+id/num_detected"
android:layout_alignParentLeft="true"
android:text="Capture" /> </RelativeLayout>

常量类

package com.crazylin.facedetected;

public class Constant {
public static final String KEY = "a9f32d6fd94da04bc162caabe7e87400";
public static final String SECRET = "BP9B_33cGnuwPOi4cq2bqNTTTeeLb3cV";
}

请求数据类

package com.crazylin.facedetected;

import java.io.ByteArrayOutputStream;

import org.json.JSONObject;

import android.graphics.Bitmap;
import android.util.Log; import com.facepp.error.FaceppParseException;
import com.facepp.http.HttpRequests;
import com.facepp.http.PostParameters; public class FaceDetect {
public interface Callback {
void success(JSONObject result); void error(FaceppParseException exeception);
} public static void detect(final Bitmap bm,final Callback callback) {
new Thread(new Runnable() { @Override
public void run() {
try {
//向Face++服务器提交请求
System.out.println("向Face++服务器提交请求");
HttpRequests requests = new HttpRequests(Constant.KEY, Constant.SECRET, true, true);
Bitmap bmsmall = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight());
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmsmall.compress(Bitmap.CompressFormat.JPEG, 50, stream); byte[] bytes = stream.toByteArray();
PostParameters params = new PostParameters();
params.setImg(bytes);
JSONObject json = requests.detectionDetect(params);
Log.e("Tag", json.toString()); if (null != callback) {
callback.success(json);
}
} catch (FaceppParseException e) {
System.out.println(e.toString());
e.printStackTrace();
if(null != callback) {
callback.error(e);
}
}
}
}).start();
}
}

ok,需要的尽管拿走吧。

下载地址

http://download.csdn.net/detail/u013270444/9437964

Android 人脸识别的更多相关文章

  1. 集成Android人脸识别demo分享

    本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...

  2. Android人脸识别Demo竖屏YUV方向调整和图片保存

    本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况. 1.首先可以尝试顺时针旋转90°或270°,然后送入识别SDK. 2.旋转方向后依然 ...

  3. Android人脸识别App(带web上传注册信息)

    人脸识别+本机Web后端人脸sdk采用虹软sdk,本机web采用AndServer:上传姓名+人脸图片即可实现注册源码地址:https://github.com/joetang1989/ArcFace ...

  4. 1 android 人脸识别

    1 https://www.google.com.hk/search?newwindow=1&safe=strict&q=android+%E5%9B%BE%E7%89%87%E4%B ...

  5. Android之人脸识别

    **前言** 人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运用,例如刷脸打卡.刷脸App,身份识别,人脸门禁等等.当前的人脸识别技术分为WEBAPI和SDK调用两种法方式 ...

  6. Android人脸检测1(静态图片)

    搭建Android人脸识别环境花了很长时间(可以查看之前的文章),解决Android开发中的杂七杂八小问题也耗时不少. 今天记录一下,点击选择照片或者拍照上传照片进行人脸检测的小demo. (andr ...

  7. Android 使用FACE++架构包实现人脸识别

    今天给大家带来一个通过使用Face++来实现人脸识别的功能. 我们先去这个Face++官网看看:http://www.faceplusplus.com.cn 我们点开案例可以看到众多我们熟知的软件都是 ...

  8. Android多媒体-人脸识别

    1. 相关背景 Google 于2006年8月收购Neven Vision 公司 (该公司拥有 10 多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并不是常快应用到免费的 Pic ...

  9. 基于虹软的Android的人脸识别SDK使用测试

    现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软的ArcFace, 闲来无事就下来 ...

随机推荐

  1. php 编译安装指导

    php 编译安装 下载源码 安装 安装后配置 下载源码 php下载地址:http://php.net/downloads.php php-7.1.11.tar.bz2 安装 安装依赖包 yum ins ...

  2. Office加载项安装

    出自我的个人主页 Alvin Blog 前言 Excel加载项离不开安装,Excel加载项本身安装及其简单,但这是在申请下来Office开发者账户之后,再次之前都得自行安装 线上安装 微软申请开发者账 ...

  3. 快速提取邮箱地址(利用word或网站)

    在word中,CTRL+F,输入:[A-z,0-9]{1,}\@[A-z,0-9,\.]{1,} 点击“高级”,勾选“使用通配符”,点击“查找全部”: 复制.粘贴. 还可通过以下页面在线提取. htt ...

  4. SAP S4CRM和C4C的技术比较

    如果您对SAP S/4HANA for Customer Management(以下简称S4CRM)和SAP Cloud for Customer(以下简称C4C)不甚熟悉,那我建议您可以先浏览我之前 ...

  5. cesium 实现路径漫游功能

    功能:路径漫游. 详细:绘制多个路径,删除路径,漫游路径选择,路径漫游. ①绘制路径 ②保存路径 ③路径切换 ④路径漫游 ⑤路径删除 ⑥删除完成

  6. Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.错误

    错误如图示: 1.在php的目录下建立个文件夹tmp,这个有权限的问题,如果是ntfs的分区,就一定要添加evryone的控制权限,否则是没用的.2.在php.ini找到session.save_pa ...

  7. Axure 8 Tab制作

    1 在[页面]面板中选中[page1] 2 在[元件库]中选中[动态面板],并拖拽到[设计区域]中 3 双[设计区域]中的动态面板,打开[动态面板管理]页面 4 在[动态面板管理]页面中输入动态面板的 ...

  8. 前端js限制上传文件类型及大小(1)

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. P1069 细胞分裂

    P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...

  10. cnn中的fp和bp推导

    昨天下午在单位从新推导了一遍fp和bp. 在整个网络的训练中,最关键的就是计算残差. 最后一层残差很容易,那么前面每一层的残差怎么计算呢? 总体来说,有多少权重就需要多少残差项来进行权重更新.每个权重 ...