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, 闲来无事就下来 ...
随机推荐
- Movideo SaaS解决方案
类型: 定制服务 软件包: media solution collateral 联系服务商 产品详情 解决方案 概要 Movideo为媒体客户提供的SaaS解决方案部署在位于全球数据中心的Azure云 ...
- word文档快速转换为PPT演示文稿
方法一: 访问http://t.im/pdftoppt,点击继续浏览(会跳转至:https://smallpdf.com/cn/pdf-to-ppt): 打开word文档,设置为“横向”,输出为PDF ...
- ODBC驱动程序丢失解决方法
今天运行SqlDbx连接数据库的时候报错,提示没有找到相应的ODBC driver,打开ODBC管理面板一看,发现里面的驱动程序都不见了.这时想起今天卸载了一个成本核算软件后成这样的,网上搜索一下只需 ...
- C4C和CRM里获取当前登录用户分配的Organization Unit信息
C4C 如何查看某个用户分配的组织单元ID: 在Employee的Organization Data区域内看到分配的组织名称,如下图红色下划线所示: 现在的需求就是使用ABSL获取当前登录用户分配的O ...
- Selenium入门12 鼠标和键盘事件
1 鼠标 集成在webdriver.ActionChains.单击.双击.右击.拖放等等. 2 键盘 引入包from selenium.webdriver.common.keys import K ...
- setTimeout详解
一.setTimeout基础 setTimeout(func|code,delay); 第一个参数表示将要推迟的函数名或者一段代码,第二个参数表示推迟执行的毫秒数 eg: console.log( ...
- spring boot学习1
转:https://blog.csdn.net/jsyxcjw/article/details/46763639 1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于 ...
- CNN中卷积的意义
在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量.需要人工设计特征,然后将用这些特征计算的值组成特征向量.在过去几十年的经验来看,人工找的特征并不总是好用.有时多了,有时少了,有 ...
- Drupal 新建Modules
最简单的模块包含了2个文件夹,它们放置于同一个文件夹下:包含模块信息的文件以.info为后缀名,而实现功能的文件则以.module结尾. 可以给模块一个友好的(human-readable)名字,但是 ...
- 基于Jquery的原生态dialog弹出窗口-zapWindow
看到boss系统搓B的填出窗口,不忍直视,坚决的换掉! 采用zapwindow(来源不清楚了,总之是前人留下的),做了修改,当前支持三类弹出类型: 1. 指定url 2. 自定义html 3. 指定D ...