Android编程示例之——人像检测
2011-09-07 18:17
176 查看
Android提供了FaceDetector用于检测人像。但是这个仅仅提供检测,也就是说只能判断这个图片是不是人。
至于识别具体是哪个人还没有实现。
Activity实现:
package xuxing.imageprocessing.facedetect;
import android.app.Activity;
import android.os.Bundle;
public class FaceDetectExampleActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FaceView faceView = new FaceView(this);
setContentView(faceView);
}
}
FaceView实现:
package xuxing.imageprocessing.facedetect;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.media.FaceDetector;
import android.util.Log;
import android.view.View;
public class FaceView extends View {
private static final int NUM_FACES = 10; // max is 64
private static final boolean DEBUG = true;
private FaceDetector arrayFaces;
private FaceDetector.Face getAllFaces[] = new FaceDetector.Face[NUM_FACES];
private FaceDetector.Face getFace = null;
private PointF eyesMidPts[] = new PointF[NUM_FACES];
private float eyesDistance[] = new float[NUM_FACES];
private Bitmap sourceImage;
private Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint pOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint pInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);
private int picWidth, picHeight;
private float xRatio, yRatio;
public FaceView(Context context) {
super(context);
pInnerBullsEye.setStyle(Paint.Style.FILL);
pInnerBullsEye.setColor(Color.RED);
pOuterBullsEye.setStyle(Paint.Style.STROKE);
pOuterBullsEye.setColor(Color.RED);
tmpPaint.setStyle(Paint.Style.STROKE);
tmpPaint.setTextAlign(Paint.Align.CENTER);
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inPreferredConfig = Bitmap.Config.RGB_565;
sourceImage = BitmapFactory.decodeResource(getResources(),
R.drawable.linyichen2, bfo);
picWidth = sourceImage.getWidth();
picHeight = sourceImage.getHeight();
arrayFaces = new FaceDetector(picWidth, picHeight, NUM_FACES);
arrayFaces.findFaces(sourceImage, getAllFaces);
for (int i = 0; i < getAllFaces.length; i++) {
getFace = getAllFaces[i];
try {
PointF eyesMP = new PointF();
getFace.getMidPoint(eyesMP);
eyesDistance[i] = getFace.eyesDistance();
eyesMidPts[i] = eyesMP;
if (DEBUG) {
Log.i("Face", i + " " + getFace.confidence() + " "
+ getFace.eyesDistance() + " " + "Pose: ("
+ getFace.pose(FaceDetector.Face.EULER_X) + ","
+ getFace.pose(FaceDetector.Face.EULER_Y) + ","
+ getFace.pose(FaceDetector.Face.EULER_Z) + ")"
+ "Eyes Midpoint: (" + eyesMidPts[i].x + ","
+ eyesMidPts[i].y + ")");
}
} catch (Exception e) {
if (DEBUG)
Log.e("Face", i + " is null");
}
}
}
@Override
protected void onDraw(Canvas canvas) {
xRatio = getWidth() * 1.0f / picWidth;
yRatio = getHeight() * 1.0f / picHeight;
canvas.drawBitmap(sourceImage, null, new Rect(0, 0, getWidth(),
getHeight()), tmpPaint);
for (int i = 0; i < eyesMidPts.length; i++) {
if (eyesMidPts[i] != null) {
pOuterBullsEye.setStrokeWidth(eyesDistance[i] / 6);
canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y
* yRatio, eyesDistance[i] / 2, pOuterBullsEye);
canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y
* yRatio, eyesDistance[i] / 6, pInnerBullsEye);
}
}
}
}
参考链接:http://www.anddev.org/quick_and_easy_facedetector_demo-t3856.html
至于识别具体是哪个人还没有实现。
Activity实现:
package xuxing.imageprocessing.facedetect;
import android.app.Activity;
import android.os.Bundle;
public class FaceDetectExampleActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FaceView faceView = new FaceView(this);
setContentView(faceView);
}
}
FaceView实现:
package xuxing.imageprocessing.facedetect;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.media.FaceDetector;
import android.util.Log;
import android.view.View;
public class FaceView extends View {
private static final int NUM_FACES = 10; // max is 64
private static final boolean DEBUG = true;
private FaceDetector arrayFaces;
private FaceDetector.Face getAllFaces[] = new FaceDetector.Face[NUM_FACES];
private FaceDetector.Face getFace = null;
private PointF eyesMidPts[] = new PointF[NUM_FACES];
private float eyesDistance[] = new float[NUM_FACES];
private Bitmap sourceImage;
private Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint pOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint pInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);
private int picWidth, picHeight;
private float xRatio, yRatio;
public FaceView(Context context) {
super(context);
pInnerBullsEye.setStyle(Paint.Style.FILL);
pInnerBullsEye.setColor(Color.RED);
pOuterBullsEye.setStyle(Paint.Style.STROKE);
pOuterBullsEye.setColor(Color.RED);
tmpPaint.setStyle(Paint.Style.STROKE);
tmpPaint.setTextAlign(Paint.Align.CENTER);
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inPreferredConfig = Bitmap.Config.RGB_565;
sourceImage = BitmapFactory.decodeResource(getResources(),
R.drawable.linyichen2, bfo);
picWidth = sourceImage.getWidth();
picHeight = sourceImage.getHeight();
arrayFaces = new FaceDetector(picWidth, picHeight, NUM_FACES);
arrayFaces.findFaces(sourceImage, getAllFaces);
for (int i = 0; i < getAllFaces.length; i++) {
getFace = getAllFaces[i];
try {
PointF eyesMP = new PointF();
getFace.getMidPoint(eyesMP);
eyesDistance[i] = getFace.eyesDistance();
eyesMidPts[i] = eyesMP;
if (DEBUG) {
Log.i("Face", i + " " + getFace.confidence() + " "
+ getFace.eyesDistance() + " " + "Pose: ("
+ getFace.pose(FaceDetector.Face.EULER_X) + ","
+ getFace.pose(FaceDetector.Face.EULER_Y) + ","
+ getFace.pose(FaceDetector.Face.EULER_Z) + ")"
+ "Eyes Midpoint: (" + eyesMidPts[i].x + ","
+ eyesMidPts[i].y + ")");
}
} catch (Exception e) {
if (DEBUG)
Log.e("Face", i + " is null");
}
}
}
@Override
protected void onDraw(Canvas canvas) {
xRatio = getWidth() * 1.0f / picWidth;
yRatio = getHeight() * 1.0f / picHeight;
canvas.drawBitmap(sourceImage, null, new Rect(0, 0, getWidth(),
getHeight()), tmpPaint);
for (int i = 0; i < eyesMidPts.length; i++) {
if (eyesMidPts[i] != null) {
pOuterBullsEye.setStrokeWidth(eyesDistance[i] / 6);
canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y
* yRatio, eyesDistance[i] / 2, pOuterBullsEye);
canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y
* yRatio, eyesDistance[i] / 6, pInnerBullsEye);
}
}
}
}
参考链接:http://www.anddev.org/quick_and_easy_facedetector_demo-t3856.html
相关文章推荐
- Android编程使用Service实现Notification定时发送功能示例
- Android编程实现通讯录中联系人的读取,查询,添加功能示例
- Android编程实现自定义title功能示例
- Android编程自定义扁平化对话框示例
- android检测网络连接状态示例讲解
- Android编程连接MongoDB及增删改查等基本操作示例
- Android编程操作手机通讯录的方法示例
- Android情景模式、文件管理器 完整示例编程详解
- Android 的网络编程(5)-通过ksoap2调用webservice示例
- Android编程录音工具类RecorderUtil定义与用法示例
- Android编程调用红外线遥控功能示例
- Android定制视图及手势检测的基本示例
- Android编程之播放器MediaPlayer实现均衡器效果示例
- Android编程基于自定义view实现公章效果示例【附源码下载】
- Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】
- Android编程实现图片的上传和下载功能示例
- android检测网络连接状态示例讲解
- Android编程实现通讯录中联系人的读取,查询,添加功能示例
- Android编程实现点击链接打开APP功能示例
- Android编程实现长按Button按钮连续响应功能示例