先看效果圖
https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.2.0-cp27-none-linux_x86_64.whl
代碼
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);
}
}