您的位置:首页 > 运维架构

安卓opencv人脸检测

2015-11-17 14:56 417 查看
先看效果图



代码

package com.example.facedetection;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import org.opencv.android.BaseLoaderCallback;

import org.opencv.android.LoaderCallbackInterface;

import org.opencv.android.OpenCVLoader;

import org.opencv.android.Utils;

import org.opencv.core.Mat;

import org.opencv.core.MatOfRect;

import org.opencv.objdetect.CascadeClassifier;

import android.app.Activity;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ImageView;

public class MainActivity extends Activity {

private Button btnObj;

private MyImageView imgObj;

private Bitmap mBitmap;

private File mCascadeFile;

private CascadeClassifier mJavaDetector;

// OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {

@Override

public void onManagerConnected(int status) {

switch (status) {

case LoaderCallbackInterface.SUCCESS: {

try {

// load cascade file from application resources

InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);

File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);

mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");

FileOutputStream os = new FileOutputStream(mCascadeFile);

byte[] buffer = new byte[4096];

int bytesRead;

while ((bytesRead = is.read(buffer)) != -1) {

os.write(buffer, 0, bytesRead);

}

is.close();

os.close();

mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());

if (mJavaDetector.empty()) {

Log.e("", "Failed to load cascade classifier");

mJavaDetector = null;

} else

Log.e("", "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());

// mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);

cascadeDir.delete();

} catch (IOException e) {

e.printStackTrace();

Log.e("", "Failed to load cascade. Exception thrown: " + e);

}

}break;

default: {

super.onManagerConnected(status);

}

break;

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btnObj = (Button) findViewById(R.id.btnId);

imgObj = (MyImageView) findViewById(R.id.imgId);

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face);

imgObj.setImageBitmap(mBitmap);

btnObj.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Mat testMat = new Mat();

Utils.bitmapToMat(mBitmap, testMat);



// Detect faces in the image.

// MatOfRect is a special container class for Rect.

MatOfRect faceDetections = new MatOfRect();

mJavaDetector.detectMultiScale(testMat, faceDetections);



Log.e(String.format("Detected %s faces",

faceDetections.toArray().length), "");

imgObj.setMat(faceDetections);

}

});

}

@Override

public void onResume() {

super.onResume();

// 通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是

// OpenCV_300_Manager_3.0_*.apk程序包,存在于OpenCV安装包的apk目录中

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this,

mLoaderCallback);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: