安卓opencv人脸检测

来源:互联网 发布:2016淘宝新店扶持期 编辑:程序博客网 时间:2024/05/23 13:01

先看效果图

代码

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);  
    }  
}

0 0