转载请注明:http://blog.csdn.net/forest_world
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ../../sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)
#OpenCV_CAMERA_MODULES:=on
#OpenCV_INSTALL_MODULES:=on
#OpenCV_LIB_TYPE:=SHARED
#include ${OpenCVROOT}/sdk/native/jni/OpenCV.mk
FdActivity.java
package org.opencv.samples.facedetect;
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.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.objdetect.CascadeClassifier;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
//import java.text.SimpleDateFormat;
import java.util.*;
//#define CV_FILLED -1
public class FdActivity extends Activity implements CvCameraViewListener2 {
private static final String TAG = "OCVSample::Activity";
private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255);
private static final Scalar green_COLOR = new Scalar(0, 139, 69, 255);
private static final Scalar blue_COLOR = new Scalar(0, 0, 255, 255);
private static final Scalar yellow_COLOR = new Scalar(238, 238, 0, 255);
private static final Scalar orange_COLOR = new Scalar(0, 153, 255, 255);
private static final Scalar red_COLOR = new Scalar(255, 0, 0, 255);
public static final int JAVA_DETECTOR = 0;
public static final int NATIVE_DETECTOR = 1;
public int count = 0;
private MenuItem mItemFace50;
private MenuItem mItemFace40;
private MenuItem mItemFace30;
private MenuItem mItemFace20;
private MenuItem mItemType;
private Mat mRgba;
private Mat mGray;
private File mCascadeFile;
private CascadeClassifier mJavaDetector;
private DetectionBasedTracker mNativeDetector;
private int mDetectorType = JAVA_DETECTOR;
private String[] mDetectorName;
private float mRelativeFaceSize = 0.2f;
private int mAbsoluteFaceSize = 0;
private CameraBridgeViewBase mOpenCvCameraView;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG,"OpenCV library load!");
if (!OpenCVLoader.initDebug()) {
Log.i(TAG,"OpenCV load not successfully");
} else {
System.loadLibrary("detection_based_tracker");// load other libraries
}
/
Log.i(TAG, "OpenCV loaded successfully");
// Load native library after(!) OpenCV initialization
System.loadLibrary("detection_based_tracker");
try {
// load cascade file from application resources
InputStream is = getResources().openRawResource(R.raw.palm/*lbpcascade_frontalface*/);
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
mCascadeFile = new File(cascadeDir, "cascade.dat"/*"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(TAG, "Failed to load cascade classifier");
mJavaDetector = null;
} else
Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());
mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);
cascadeDir.delete();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
}
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
static {
Log.i(TAG,"OpenCV library load!");
if (!OpenCVLoader.initDebug()) {
Log.i(TAG,"OpenCV load not successfully");
} else {
System.loadLibrary("detection_based_tracker");// load other libraries
}
}
public FdActivity() {
mDetectorName = new String[2];
mDetectorName[JAVA_DETECTOR] = "Java";
mDetectorName[NATIVE_DETECTOR] = "Native (tracking)";
Log.i(TAG, "Instantiated new " + this.getClass());
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.face_detect_surface_view);
// add start
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(TAG,"Failed to load cascade classifier");
mJavaDetector = null;
}
else
Log.i(TAG,"Loaded cascade classifier from"+ mCascadeFile.getAbsolutePath());
mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);
cascadeDir.delete();
}
catch (IOException e)
{
e.printStackTrace();
Log.e(TAG,"Failed to load cascade. Exception thrown:"+ e);
}
//add end
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.fd_activity_surface_view);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.enableView();// add.
//mOpenCvCameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT);//前置摄像头 CameraBridgeViewBase.CAMERA_ID_BACK为后置摄像头
mOpenCvCameraView.setCvCameraViewListener(this);
}
@Override
public void onPause()
{
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public void onResume()
{
super.onResume();
//OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}
public void onDestroy() {
super.onDestroy();
mOpenCvCameraView.disableView();
}
public void onCameraViewStarted(int width, int height) {
mGray = new Mat();
mRgba = new Mat();
}
public void onCameraViewStopped() {
mGray.release();
mRgba.release();
}
public int min(int a, int b) {
if(a<=b)
return a;
else
return b;
}
public int max(int a, int b) {
if(a>=b)
return a;
else
return b;
}
public float bbOverlap(Rect facesArray1 ,Rect facesArray2)
{
if (facesArray1.x > facesArray2.x+facesArray2.width)
{ return 0; }
if (facesArray1.y > facesArray2.y+facesArray2.height)
{ return 0; }
if (facesArray1.x+facesArray1.width < facesArray2.x)
{ return 0; }
if (facesArray1.y+facesArray1.height < facesArray2.y)
{ return 0; }
float colInt = min(facesArray1.x+facesArray1.width,facesArray2.x+facesArray2.width) -
max(facesArray1.x, facesArray2.x);
float rowInt = min(facesArray1.y+facesArray1.height,facesArray2.y+facesArray2.height) -
max(facesArray1.y,facesArray2.y);
float intersection = colInt * rowInt;
float area1 = facesArray1.width*facesArray1.height;
float area2 = facesArray1.width*facesArray2.height;
return intersection / (area1 + area2 - intersection);
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
mGray = inputFrame.gray();
if (mAbsoluteFaceSize == 0) {
int height = mGray.rows();
if (Math.round(height * mRelativeFaceSize) > 0) {
mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
}
mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);
}
MatOfRect faces = new MatOfRect();
//if (mDetectorType == JAVA_DETECTOR) {
//if (mJavaDetector != null)
mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE
new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
//}
//else if (mDetectorType == NATIVE_DETECTOR) {
//if (mNativeDetector != null)
//mNativeDetector.detect(mGray, faces);
//}
//else {
// Log.e(TAG, "Detection method is not selected!");
//}
Rect[] facesArray = faces.toArray();
for (int i = 0; i < facesArray.length-1; i++)
for (int j = i+1; j < facesArray.length; j++)
{
if((facesArray[j].tl().x >=facesArray[i].tl().x)&&(facesArray[j].tl().y >=facesArray[i].tl().y)&&
(facesArray[j].br().x <=facesArray[i].br().x)&&(facesArray[j].br().x <=facesArray[i].br().x)
)
{
facesArray[j].x = facesArray[j].y = facesArray[j].width = facesArray[j].height = 0;
}
else if((facesArray[j].tl().x <=facesArray[i].tl().x)&&(facesArray[j].tl().y <=facesArray[i].tl().y)&&
(facesArray[j].br().x >=facesArray[i].br().x)&&(facesArray[j].br().x >=facesArray[i].br().x)
)
{
facesArray[i].x = facesArray[i].y = facesArray[i].width = facesArray[i].height = 0;
}
//if(bbOverlap(facesArray[i] ,facesArray[j]) > 0)
//{
// facesArray[j].x = facesArray[j].y = facesArray[j].width = facesArray[j].height = 0;
// num++;
//}
}
int num = facesArray.length;
for (int i = 0; i < facesArray.length-1; i++)
{
if((facesArray[i].width == 0)&&(facesArray[i].height == 0))
{
for (int j = facesArray.length-1; j >= 0; j--)
{
if((facesArray[j].width != 0)&&(facesArray[j].height != 0))
{
facesArray[i].x = facesArray[j].x;
facesArray[i].y = facesArray[j].y;
facesArray[i].width = facesArray[j].width;
facesArray[i].height = facesArray[j].height;
facesArray[j].x = 0;
facesArray[j].y = 0;
facesArray[j].width = 0;
facesArray[j].height = 0;
num--;
}
}
}
}
Point point1 = new Point(60, 30);
//Core.putText(mRgba, text, point1, fontFace, fontScale, red_COLOR,4);
for (int i = 0; i < /*facesArray.length*/num; i++)
{
Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), red_COLOR, 5);
Point p1_e = new Point(facesArray[i].tl().x, facesArray[i].tl().y + 0.9*mRgba.height()/10.);
Point p2_e = new Point(facesArray[i].br().x, facesArray[i].tl().y + 3.1*mRgba.height()/10.);
//Core.rectangle(mRgba, p1_e, p2_e, green_COLOR, 5);
}
if(num > 0)
count +=10;
else if(num == 0)
count -=2;
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
Point point2 = new Point(1*mRgba.width()/8., 2*mRgba.height()/8.);
Point point3 = new Point(1*mRgba.width()/8., 3*mRgba.height()/8.);
Point point4 = new Point(1*mRgba.width()/8., 4*mRgba.height()/8.);
Point p1_warning = new Point(2*mRgba.width()/8., 6*mRgba.height()/8.);
Point p2_warning = new Point(6*mRgba.width()/8., 7*mRgba.height()/8.);
//Core.rectangle(mRgba, p1_warning, p2_warning, green_COLOR, -1);
return mRgba;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Log.i(TAG, "called onCreateOptionsMenu");
mItemFace50 = menu.add("Face size 50%");
mItemFace40 = menu.add("Face size 40%");
mItemFace30 = menu.add("Face size 30%");
mItemFace20 = menu.add("Face size 20%");
mItemType = menu.add(mDetectorName[mDetectorType]);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
if (item == mItemFace50)
setMinFaceSize(0.5f);
else if (item == mItemFace40)
setMinFaceSize(0.4f);
else if (item == mItemFace30)
setMinFaceSize(0.3f);
else if (item == mItemFace20)
setMinFaceSize(0.2f);
else if (item == mItemType) {
int tmpDetectorType = (mDetectorType + 1) % mDetectorName.length;
item.setTitle(mDetectorName[tmpDetectorType]);
setDetectorType(tmpDetectorType);
}
return true;
}
private void setMinFaceSize(float faceSize) {
mRelativeFaceSize = faceSize;
mAbsoluteFaceSize = 0;
}
private void setDetectorType(int type) {
if (mDetectorType != type) {
mDetectorType = type;
if (type == NATIVE_DETECTOR) {
Log.i(TAG, "Detection Based Tracker enabled");
mNativeDetector.start();
} else {
Log.i(TAG, "Cascade detector enabled");
mNativeDetector.stop();
}
}
}
}
出现问题:Can’t load CascadeClassifier解决: