include $(OPENCV_MK_PATH)
endif
-LOCAL_SRC_FILES := DetectionBaseTracker.cpp
-LOCAL_C_INCLUDES := $(LOCAL_PATH)
+LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
+LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
-LOCAL_MODULE := detection_base_tacker
+LOCAL_MODULE := detection_based_tacker
include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file
+++ /dev/null
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_opencv_samples_fd_DetectionBaseTracker */
-
-#ifndef _Included_org_opencv_samples_fd_DetectionBaseTracker
-#define _Included_org_opencv_samples_fd_DetectionBaseTracker
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class: org_opencv_samples_fd_DetectionBaseTracker
- * Method: nativeCreateObject
- * Signature: (Ljava/lang/String;F)J
- */
-JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeCreateObject
- (JNIEnv *, jclass, jstring, jint);
-
-/*
- * Class: org_opencv_samples_fd_DetectionBaseTracker
- * Method: nativeDestroyObject
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeDestroyObject
- (JNIEnv *, jclass, jlong);
-
-/*
- * Class: org_opencv_samples_fd_DetectionBaseTracker
- * Method: nativeStart
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeStart
- (JNIEnv *, jclass, jlong);
-
-/*
- * Class: org_opencv_samples_fd_DetectionBaseTracker
- * Method: nativeStop
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeStop
- (JNIEnv *, jclass, jlong);
-
- /*
- * Class: org_opencv_samples_fd_DetectionBaseTracker
- * Method: nativeSetFaceSize
- * Signature: (JI)V
- */
- JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeSetFaceSize
- (JNIEnv *, jclass, jlong, jint);
-
-/*
- * Class: org_opencv_samples_fd_DetectionBaseTracker
- * Method: nativeDetect
- * Signature: (JJJ)V
- */
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeDetect
- (JNIEnv *, jclass, jlong, jlong, jlong);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
-#include <DetectionBaseTracker.h>
-#include <opencv2/core/core.hpp>
+#include <DetectionBasedTracker_jni.h>
+#include <opencv2/core/core.hpp>
#include <opencv2/contrib/detection_based_tracker.hpp>
#include <string>
using namespace std;
using namespace cv;
-vector<Rect> RectFaces;
-
inline void vector_Rect_to_Mat(vector<Rect>& v_rect, Mat& mat)
{
mat = Mat(v_rect, true);
}
-JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeCreateObject
+JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeCreateObject
(JNIEnv * jenv, jclass jobj, jstring jFileName, jint faceSize)
{
const char* jnamestr = jenv->GetStringUTFChars(jFileName, NULL);
je = jenv->FindClass("java/lang/Exception");
jenv->ThrowNew(je, e.what());
}
+ catch (...)
+ {
+ LOGD("nativeCreateObject catched unknown exception");
+ jclass je = jenv->FindClass("java/lang/Exception");
+ jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}");
+ return 0;
+ }
return result;
}
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeDestroyObject
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDestroyObject
(JNIEnv * jenv, jclass jobj, jlong thiz)
{
try
je = jenv->FindClass("java/lang/Exception");
jenv->ThrowNew(je, e.what());
}
+ catch (...)
+ {
+ LOGD("nativeDestroyObject catched unknown exception");
+ jclass je = jenv->FindClass("java/lang/Exception");
+ jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}");
+ }
}
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeStart
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStart
(JNIEnv * jenv, jclass jobj, jlong thiz)
{
try
je = jenv->FindClass("java/lang/Exception");
jenv->ThrowNew(je, e.what());
}
-
+ catch (...)
+ {
+ LOGD("nativeStart catched unknown exception");
+ jclass je = jenv->FindClass("java/lang/Exception");
+ jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}");
+ }
}
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeStop
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStop
(JNIEnv * jenv, jclass jobj, jlong thiz)
{
try
je = jenv->FindClass("java/lang/Exception");
jenv->ThrowNew(je, e.what());
}
+ catch (...)
+ {
+ LOGD("nativeStop catched unknown exception");
+ jclass je = jenv->FindClass("java/lang/Exception");
+ jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}");
+ }
}
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeSetFaceSize
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeSetFaceSize
(JNIEnv * jenv, jclass jobj, jlong thiz, jint faceSize)
{
try
if(!je)
je = jenv->FindClass("java/lang/Exception");
jenv->ThrowNew(je, e.what());
- }
+ }
+ catch (...)
+ {
+ LOGD("nativeSetFaceSize catched unknown exception");
+ jclass je = jenv->FindClass("java/lang/Exception");
+ jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}");
+ }
}
-JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeDetect
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDetect
(JNIEnv * jenv, jclass jobj, jlong thiz, jlong imageGray, jlong faces)
{
try
{
+ vector<Rect> RectFaces;
((DetectionBasedTracker*)thiz)->process(*((Mat*)imageGray));
((DetectionBasedTracker*)thiz)->getObjects(RectFaces);
vector_Rect_to_Mat(RectFaces, *((Mat*)faces));
{
LOGD("nativeCreateObject catched cv::Exception: %s", e.what());
jclass je = jenv->FindClass("org/opencv/core/CvException");
- if(!je)
+ if(!je)
je = jenv->FindClass("java/lang/Exception");
jenv->ThrowNew(je, e.what());
}
+ catch (...)
+ {
+ LOGD("nativeDetect catched unknown exception");
+ jclass je = jenv->FindClass("java/lang/Exception");
+ jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}");
+ }
}
\ No newline at end of file
--- /dev/null
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_opencv_samples_fd_DetectionBasedTracker */
+
+#ifndef _Included_org_opencv_samples_fd_DetectionBasedTracker
+#define _Included_org_opencv_samples_fd_DetectionBasedTracker
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: org_opencv_samples_fd_DetectionBasedTracker
+ * Method: nativeCreateObject
+ * Signature: (Ljava/lang/String;F)J
+ */
+JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeCreateObject
+ (JNIEnv *, jclass, jstring, jint);
+
+/*
+ * Class: org_opencv_samples_fd_DetectionBasedTracker
+ * Method: nativeDestroyObject
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDestroyObject
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: org_opencv_samples_fd_DetectionBasedTracker
+ * Method: nativeStart
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStart
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: org_opencv_samples_fd_DetectionBasedTracker
+ * Method: nativeStop
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStop
+ (JNIEnv *, jclass, jlong);
+
+ /*
+ * Class: org_opencv_samples_fd_DetectionBasedTracker
+ * Method: nativeSetFaceSize
+ * Signature: (JI)V
+ */
+ JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeSetFaceSize
+ (JNIEnv *, jclass, jlong, jint);
+
+/*
+ * Class: org_opencv_samples_fd_DetectionBasedTracker
+ * Method: nativeDetect
+ * Signature: (JJJ)V
+ */
+JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDetect
+ (JNIEnv *, jclass, jlong, jlong, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+++ /dev/null
-package org.opencv.samples.fd;
-
-import org.opencv.core.Mat;
-import org.opencv.core.MatOfRect;
-
-public class DetectionBaseTracker
-{
- public DetectionBaseTracker(String filename, int faceSize)
- {
- mNativeObj = nativeCreateObject(filename, faceSize);
- }
-
- public void start()
- {
- nativeStart(mNativeObj);
- }
-
- public void stop()
- {
- nativeStop(mNativeObj);
- }
-
- public void setMinFaceSize(int faceSize)
- {
- nativeSetFaceSize(mNativeObj, faceSize);
- }
-
- public void detect(Mat imageGray, MatOfRect faces)
- {
- nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr());
- }
-
- public void release()
- {
- nativeDestroyObject(mNativeObj);
- mNativeObj = 0;
- }
-
- protected long mNativeObj = 0;
-
- protected static native long nativeCreateObject(String filename, int faceSize);
- protected static native void nativeDestroyObject(long thiz);
- protected static native void nativeStart(long thiz);
- protected static native void nativeStop(long thiz);
- protected static native void nativeSetFaceSize(long thiz, int faceSize);
- protected static native void nativeDetect(long thiz, long inputImage, long resultMat);
-
- static
- {
- System.loadLibrary("detection_base_tacker");
- }
-}
--- /dev/null
+package org.opencv.samples.fd;
+
+import org.opencv.core.Mat;
+import org.opencv.core.MatOfRect;
+
+public class DetectionBasedTracker
+{
+ public DetectionBasedTracker(String cascadeName, int minFaceSize)
+ {
+ mNativeObj = nativeCreateObject(cascadeName, minFaceSize);
+ }
+
+ public void start()
+ {
+ nativeStart(mNativeObj);
+ }
+
+ public void stop()
+ {
+ nativeStop(mNativeObj);
+ }
+
+ public void setMinFaceSize(int size)
+ {
+ nativeSetFaceSize(mNativeObj, size);
+ }
+
+ public void detect(Mat imageGray, MatOfRect faces)
+ {
+ nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr());
+ }
+
+ public void release()
+ {
+ nativeDestroyObject(mNativeObj);
+ mNativeObj = 0;
+ }
+
+ private long mNativeObj = 0;
+
+ private static native long nativeCreateObject(String cascadeName, int minFaceSize);
+ private static native void nativeDestroyObject(long thiz);
+ private static native void nativeStart(long thiz);
+ private static native void nativeStop(long thiz);
+ private static native void nativeSetFaceSize(long thiz, int size);
+ private static native void nativeDetect(long thiz, long inputImage, long faces);
+
+ static
+ {
+ System.loadLibrary("detection_based_tacker");
+ }
+}
public FdActivity() {
Log.i(TAG, "Instantiated new " + this.getClass());
mDetectorName = new String[2];
- mDetectorName[0] = "Cascade";
- mDetectorName[1] = "DBT";
+ mDetectorName[FdView.JAVA_DETECTOR] = "Java";
+ mDetectorName[FdView.NATIVE_DETECTOR] = "Native (tracking)";
}
@Override
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mView = new FdView(this);
- mView.setDtetectorType(mDetectorType);
+ mView.setDetectorType(mDetectorType);
+ mView.setMinFaceSize(0.2f);
setContentView(mView);
}
{
mDetectorType = (mDetectorType + 1) % mDetectorName.length;
item.setTitle(mDetectorName[mDetectorType]);
- mView.setDtetectorType(mDetectorType);
+ mView.setDetectorType(mDetectorType);
}
return true;
}
import android.view.SurfaceHolder;
class FdView extends SampleCvViewBase {
- private static final String TAG = "Sample::FdView";
- private Mat mRgba;
- private Mat mGray;
- private File mCascadeFile;
- private CascadeClassifier mCascade;
- private DetectionBaseTracker mTracker;
-
- public final int CASCADE_DETECTOR = 0;
- public final int DBT_DETECTOR = 1;
+ private static final String TAG = "Sample::FdView";
+ private Mat mRgba;
+ private Mat mGray;
+ private File mCascadeFile;
+ private CascadeClassifier mJavaDetector;
+ private DetectionBasedTracker mNativeDetector;
+
+ private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255);
- private int mDetectorType = CASCADE_DETECTOR;
+ public static final int JAVA_DETECTOR = 0;
+ public static final int NATIVE_DETECTOR = 1;
+
+ private int mDetectorType = JAVA_DETECTOR;
- public static int mFaceSize = 200;
+ private float mRelativeFaceSize = 0;
+ private int mAbsoluteFaceSize = 0;
public void setMinFaceSize(float faceSize)
{
- int height = mGray.rows();
- if (Math.round(height * faceSize) > 0);
- {
- mFaceSize = Math.round(height * faceSize);
- }
- mTracker.setMinFaceSize(mFaceSize);
+ mRelativeFaceSize = faceSize;
+ mAbsoluteFaceSize = 0;
}
- public void setDtetectorType(int type)
+ public void setDetectorType(int type)
{
if (mDetectorType != type)
{
mDetectorType = type;
- if (type == DBT_DETECTOR)
+ if (type == NATIVE_DETECTOR)
{
- Log.i(TAG, "Detection Base Tracker enabled");
- mTracker.start();
+ Log.i(TAG, "Detection Based Tracker enabled");
+ mNativeDetector.start();
}
else
{
- Log.i(TAG, "Cascade detectior enabled");
- mTracker.stop();
+ Log.i(TAG, "Cascade detector enabled");
+ mNativeDetector.stop();
}
}
}
is.close();
os.close();
- mCascade = new CascadeClassifier(mCascadeFile.getAbsolutePath());
- if (mCascade.empty()) {
+ mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
+ if (mJavaDetector.empty()) {
Log.e(TAG, "Failed to load cascade classifier");
- mCascade = null;
+ mJavaDetector = null;
} else
Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());
- mTracker = new DetectionBaseTracker(mCascadeFile.getAbsolutePath(), 0);
+ mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);
cascadeDir.delete();
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
+ 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 == CASCADE_DETECTOR)
+ if (mDetectorType == JAVA_DETECTOR)
{
- if (mCascade != null)
- mCascade.detectMultiScale(mGray, faces, 1.1, 2, 2 // TODO: objdetect.CV_HAAR_SCALE_IMAGE
- , new Size(mFaceSize, mFaceSize), new Size());
+ 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 == DBT_DETECTOR)
+ else if (mDetectorType == NATIVE_DETECTOR)
{
- if (mTracker != null)
- mTracker.detect(mGray, faces);
+ if (mNativeDetector != null)
+ mNativeDetector.detect(mGray, faces);
}
else
{
Log.e(TAG, "Detection method is not selected!");
}
- for (Rect r : faces.toArray())
- Core.rectangle(mRgba, r.tl(), r.br(), new Scalar(0, 255, 0, 255), 3);
+ Rect[] facesArray = faces.toArray();
+ for (int i = 0; i < facesArray.length; i++)
+ Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);
- Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.RGB_565/*.ARGB_8888*/);
+ Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
try {
Utils.matToBitmap(mRgba, bmp);
- return bmp;
} catch(Exception e) {
- Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage());
+ Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage());
bmp.recycle();
- return null;
+ bmp = null;
}
+
+ return bmp;
}
@Override
mGray.release();
if (mCascadeFile != null)
mCascadeFile.delete();
- if (mTracker != null)
- mTracker.release();
+ if (mNativeDetector != null)
+ mNativeDetector.release();
mRgba = null;
mGray = null;