Android 人脸识别
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 人脸识别的更多相关文章
- 集成Android人脸识别demo分享
本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...
- Android人脸识别Demo竖屏YUV方向调整和图片保存
本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况. 1.首先可以尝试顺时针旋转90°或270°,然后送入识别SDK. 2.旋转方向后依然 ...
- Android人脸识别App(带web上传注册信息)
人脸识别+本机Web后端人脸sdk采用虹软sdk,本机web采用AndServer:上传姓名+人脸图片即可实现注册源码地址:https://github.com/joetang1989/ArcFace ...
- 1 android 人脸识别
1 https://www.google.com.hk/search?newwindow=1&safe=strict&q=android+%E5%9B%BE%E7%89%87%E4%B ...
- Android之人脸识别
**前言** 人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运用,例如刷脸打卡.刷脸App,身份识别,人脸门禁等等.当前的人脸识别技术分为WEBAPI和SDK调用两种法方式 ...
- Android人脸检测1(静态图片)
搭建Android人脸识别环境花了很长时间(可以查看之前的文章),解决Android开发中的杂七杂八小问题也耗时不少. 今天记录一下,点击选择照片或者拍照上传照片进行人脸检测的小demo. (andr ...
- Android 使用FACE++架构包实现人脸识别
今天给大家带来一个通过使用Face++来实现人脸识别的功能. 我们先去这个Face++官网看看:http://www.faceplusplus.com.cn 我们点开案例可以看到众多我们熟知的软件都是 ...
- Android多媒体-人脸识别
1. 相关背景 Google 于2006年8月收购Neven Vision 公司 (该公司拥有 10 多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并不是常快应用到免费的 Pic ...
- 基于虹软的Android的人脸识别SDK使用测试
现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软的ArcFace, 闲来无事就下来 ...
随机推荐
- Struts2_HelloWorld_5
1.设置开发模式: 更换配置文件中的 action name="hello_struts",重新访问会出错,因为配置没有立刻响应文件的即时修改. 需要加上配置 <consta ...
- 开发中常用的sql语句二
sql 数字全角半角转换 create FUNCTION dbo.ConvertWordAngle ( ), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )) A ...
- python3绘图示例5(基于matplotlib:正弦图等)
#!/usr/bin/env python# -*- coding:utf-8 -*- import numpy as npimport pylab as pyimport matplotlib as ...
- day003-List类、Set类
(一) 知识回顾1. day002总结 泛型没有多态.如果泛型能实现多态,那么数据类型就不安全了.违背了设计泛型的初衷. 1.1 伪泛型 泛型只存在编译器,编译生成的字节码中,不存在泛型变量的. 1. ...
- vim复制粘贴到系统剪贴板
一般来讲,如果你没有在.vimrc中配置过相关的信息的话,可以考虑下面的方法.系统环境 Ubuntu 14.04 LTS. 安装与使用 首先需要安装一个vim-gtk 命令$sudo apt-get ...
- Python元组、列表、字典、集合
1. 元组 元组由不同元素组成,每个元素可以存储不同类型的数据,元组是有序的,元组创建后不能再做任何修改. 元组的创建: tuple = ('a','b','c','d') 如果创建的元组只有1个元素 ...
- MySQL数据库实验三:连接查询
实验三 连接查询 实验名称:连接查询(2课时) 一.实验目的 理解JOIN语句的操作和基本使用方法,掌握内连接.外连接.自身连接的概念和使用. 二.实验环境 是MS SQL SERVER 200 ...
- I2C总线协议学习笔记 (转载)
1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL. SDA传输数据是大端传输,每次传输8bit,即一字节. 支持多主控(multimastering),任何时间点只能有一 ...
- MySQL 数据库和一些常用命令的使用
常用命令总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...
- Spring boot 自动配置自定义配置文件
示例如下: 1. 新建 Maven 项目 properties 2. pom.xml <project xmlns="http://maven.apache.org/POM/4 ...