Skip to content

Commit 7d14e41

Browse files
committed
Instrumented Test of OpenCV HAAR FD
1 parent 43e6d4b commit 7d14e41

File tree

10 files changed

+203
-36
lines changed

10 files changed

+203
-36
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@ build/
55
local.properties
66
.DS_Store
77
captures/
8+
./FaceTracker/app/build/intermediates/jniLibs/release/*
9+
./FaceTracker/openCVLibrary330/build/intermediates/jniLibs/release/*
10+
./FaceTracker/app/src/main/JniLibs/*
11+
*.so
12+
*.a

FaceTracker/app/build.gradle

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,29 +20,43 @@ android {
2020
externalNativeBuild {
2121
cmake {
2222
cppFlags "-frtti -fexceptions"
23-
//abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
23+
//
24+
// abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
2425
abiFilters 'armeabi-v7a'
2526
arguments "-DANDROID_STL=gnustl_shared"
2627
//arguments "-DANDROID_STL=c++_shared"
2728
// AL: arguments "-DANDROID_STL=c++_shared", "-DBUILD_opencv_apps:BOOL=ON", "-DBUILD_SHARED_LIBS:BOOL=ON"
2829
// Passes optional arguments to CMake.
2930
//arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
30-
31-
// Sets a flag to enable format macro constants for the C compiler.
32-
//cFlags "-D__STDC_FORMAT_MACROS"
3331
}
3432
}
3533
signingConfig signingConfigs.config
34+
35+
// AL (
36+
// Specifies the application ID for the test APK.
37+
testApplicationId "org.opencv.android.facetracker"
38+
// Specifies the fully-qualified class name of the test instrumentation runner.
3639
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
40+
// If set to 'true', enables the instrumentation class to start and stop profiling.
41+
// If set to false (default), profiling occurs the entire time the instrumentation
42+
// class is running.
43+
// testHandleProfiling true
44+
// If set to 'true', indicates that the Android system should run the instrumentation
45+
// class as a functional test. The default value is 'false'
46+
// testFunctionalTest true
47+
// AL )
48+
49+
3750
}
3851

52+
3953
// sourceSets { // AL: added
40-
// main {
41-
// jniLibs.srcDirs = ['src/main/jniLibs']
42-
// jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/']
43-
// //jni.srcDirs = []
44-
// }
45-
// }
54+
// main {jniLibs.srcDirs = ['src/main/jniLibs']
55+
// jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] //jni.srcDirs = [] } }
56+
57+
// allprojects { tasks.withType(JavaCompile) {
58+
// options.compilerArgs << "-Xlint:deprecation" }}
59+
4660

4761
buildTypes {
4862
release {
@@ -69,12 +83,23 @@ android {
6983
lintOptions {
7084
abortOnError false
7185
}
86+
sourceSets {
87+
main { jniLibs.srcDirs = ['src/main/jniLibs'] }
88+
androidTest { // AL
89+
java.srcDir file('src/androidTest/java')
90+
resources.srcDir file('src/androidTest/assets')
91+
}
92+
//instrumentTest.setRoot('src/androidTest/')
93+
}
94+
configurations.all {
95+
resolutionStrategy.force 'com.android.support:support-annotations:23.4.0'
96+
}
7297
}
7398

7499
dependencies {
75100
implementation fileTree(include: ['*.jar'], dir: 'libs')
76101
androidTestImplementation 'junit:junit:4.12'
77-
implementation 'com.android.support:support-annotations:27.1.1'
102+
implementation 'com.android.support:support-annotations:23.4.0'
78103
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
79104
androidTestImplementation 'com.android.support.test:runner:1.0.2'
80105
androidTestImplementation 'com.android.support.test:rules:1.0.2'
@@ -84,4 +109,5 @@ dependencies {
84109
implementation 'com.android.support:design:23.4.0'
85110
implementation 'com.google.android.gms:play-services-vision:9.4.0+'
86111
implementation 'com.shamanland:xdroid-toaster:0.2.4'
112+
implementation project(':openCVLibrary330')
87113
}

FaceTracker/app/src/androidTest/java/com/google/android/gms/samples/vision/face/facetracker/ExampleInstrumentedTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313

1414
@RunWith(AndroidJUnit4.class)
1515
public class ExampleInstrumentedTest {
16+
1617
@Test
1718
public void useAppContext() throws Exception {
1819
Context appContext = InstrumentationRegistry.getTargetContext();
1920
assertEquals("com.google.android.gms.samples.vision.face.facetracker", appContext.getPackageName());
2021
}
2122

22-
2323
@Rule
2424
public ActivityTestRule<FaceTrackerActivity> activityRule = new ActivityTestRule(FaceTrackerActivity.class);
2525

FaceTracker/app/src/androidTest/java/dlib/android/FaceRecognizerTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,18 @@
1212
import java.io.IOException;
1313
import java.io.InputStream;
1414

15-
import static org.junit.Assert.assertEquals;
15+
import static junit.framework.Assert.assertEquals;
16+
1617

1718
public class FaceRecognizerTest {
1819
private static final String TAG = "FaceRecognizerTest";
1920

21+
2022
@Test
2123
public void RecognizeTest() throws IOException {
2224
FaceRecognizer fr = new FaceRecognizer();
2325
fr.loadNative();
26+
2427
Context testContext = InstrumentationRegistry.getInstrumentation().getContext();
2528
InputStream testInput = testContext.getAssets().open("11.png");
2629
Bitmap bitmap = BitmapFactory.decodeStream(testInput);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.opencv.android.facetracker;
2+
3+
import android.content.Context;
4+
import android.graphics.Bitmap;
5+
import android.graphics.BitmapFactory;
6+
import android.text.TextUtils;
7+
8+
import org.opencv.android.Utils;
9+
import org.opencv.core.Mat;
10+
import org.opencv.core.MatOfRect;
11+
12+
import java.io.IOException;
13+
import java.io.InputStream;
14+
import android.support.test.InstrumentationRegistry;
15+
import org.junit.Test;
16+
17+
18+
import static junit.framework.Assert.assertEquals;
19+
20+
/**
21+
* Created by alorusso on 07/06/18.
22+
*/
23+
24+
public class HaarDetectorTest {
25+
private static final String TAG = "FaceTrackerTest";
26+
static {
27+
System.loadLibrary("opencv_java3");
28+
}
29+
30+
public HaarDetectorTest() {
31+
}
32+
33+
@Test
34+
public void OCVTrackerTest() throws IOException {
35+
36+
HaarDetector hd = new HaarDetector();
37+
hd.loadNative();
38+
39+
Context testContext = InstrumentationRegistry.getInstrumentation().getContext();
40+
InputStream testInput = testContext.getAssets().open("11.png");
41+
Bitmap bitmap = BitmapFactory.decodeStream(testInput);
42+
43+
Mat matImg = new Mat();
44+
MatOfRect rectList = new MatOfRect();
45+
46+
Utils.bitmapToMat(bitmap, matImg);
47+
48+
hd.OCvDetect(matImg.getNativeObjAddr(), rectList.getNativeObjAddr());
49+
50+
System.out.println("Number of faces = " + rectList.size());
51+
52+
//
53+
//assertEquals("Number of faces %d", rectList.size());
54+
//Rect[] faces = rects.toArray();
55+
//
56+
//for (int i=0; i<faces.length; i++)
57+
//Imgproc.rectangle(bitmap, faces[i].tl(),faces[i].br(), Scalar(255,255,255,255),3)
58+
//
59+
}
60+
}

FaceTracker/app/src/main/cpp/OCV-native-lib.cpp

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,42 +14,78 @@
1414
using namespace std;
1515
using namespace cv;
1616

17-
#define AppTag "OCV-FD::Activity"
17+
18+
#define LOG_TAG "OCV-Native"
19+
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
20+
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
21+
22+
1823

1924
extern "C"
2025
{
2126

27+
/*
28+
inline void vector_Rect_to_Mat(vector<Rect>& v_rect, Mat& mat)
29+
{
30+
mat = Mat(v_rect, true);
31+
}
32+
*/
2233

23-
void detect(Mat &gray) {
34+
inline void vector_Rect_to_Mat(std::vector<Rect>& v_rect, Mat& mat)
35+
{
36+
mat = Mat(v_rect, true);
37+
}
2438

25-
String face_cascade_name = "/sdcard/Download/haarcascade_frontalface_default.xml";
2639

27-
CascadeClassifier face_cascade;
28-
std::vector<Rect> faces;
40+
CascadeClassifier face_cascade;
2941

30-
if( !face_cascade.load( face_cascade_name ) ){
31-
printf("--(!)Error loading\n");
32-
__android_log_print(ANDROID_LOG_DEBUG, AppTag, "Resources NOT found: exiting");
33-
return;
34-
}
42+
vector<Rect> detect(Mat &gray) {
3543

36-
face_cascade.detectMultiScale(gray,faces,1.1,3,0,Size(20,20),Size(1000,1000));
44+
std::vector<Rect> faces = {};
45+
face_cascade.detectMultiScale(gray, faces, 1.1, 3, 0, Size(20, 20), Size(1000, 1000));
3746

38-
for(size_t i=0; i<faces.size(); i++)
39-
{
40-
rectangle(gray,faces[i],cv::Scalar(255, 255, 255), 2, 8, 0);
47+
/*
48+
for (size_t i = 0; i < faces.size(); i++) {
49+
rectangle(gray, faces[i], cv::Scalar(255, 255, 255), 2, 8, 0);
4150
}
51+
*/
52+
return faces;
4253
}
4354

4455

45-
void JNICALL
46-
Java_ch_hepia_iti_opencvnativeandroidstudio_MainActivity_imgProcess(JNIEnv *env, jclass,
47-
jlong inputAddrMat,
48-
jlong imageAddrGray) {
49-
Mat &mRgb = *(Mat *)inputAddrMat;
50-
Mat &mGray = *(Mat *)imageAddrGray;
5156

52-
detect (mGray);
57+
JNIEXPORT void JNICALL
58+
Java_org_opencv_android_facetracker_HaarDetector_loadResources(
59+
JNIEnv *env, jobject instance)
60+
{
61+
String face_cascade_name = "/sdcard/Download/haarcascade_frontalface_default.xml";
62+
63+
if (!face_cascade.load(face_cascade_name)) {
64+
LOGE("OCV resources NOT loaded");
65+
return;
66+
} else {
67+
LOGI("OCV resources loaded");
68+
}
5369
}
5470

71+
72+
JNIEXPORT void JNICALL
73+
Java_org_opencv_android_facetracker_HaarDetector_OpenCVdetector(JNIEnv *env, jclass instance,
74+
jlong inputAddrMat, jlong matRects) {
75+
76+
vector<Rect> faces;
77+
78+
79+
Mat &origImg = *((Mat *)inputAddrMat);
80+
Mat mGray;
81+
cv::cvtColor(origImg, mGray, CV_BGR2GRAY);
82+
83+
faces = detect (mGray);
84+
//faces = detect(origImg);
85+
86+
vector_Rect_to_Mat(faces, *((Mat*)matRects));
5587
}
88+
}
89+
90+
// inline void Mat_to_vector_Rect (Mat &mat, vector <Rect> &v_rect);
91+
// ((Mat*)matRect) = Mat(faces, true);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.opencv.android.facetracker;
2+
3+
import org.opencv.android.BaseLoaderCallback;
4+
import org.opencv.android.LoaderCallbackInterface;
5+
import org.opencv.android.OpenCVLoader;
6+
import android.util.Log;
7+
8+
/**
9+
* Created by alorusso on 06/06/18.
10+
*/
11+
12+
public class HaarDetector {
13+
private static final String TAG = "OCV-HaarDetector";
14+
15+
16+
public HaarDetector() {
17+
//System.loadLibrary("opencv_java3");
18+
}
19+
20+
public void loadNative() {
21+
System.loadLibrary("OCV-native-lib");
22+
23+
loadResources();
24+
}
25+
26+
public void OCvDetect(long imageGray, long faces) {
27+
OpenCVdetector(imageGray, faces);
28+
}
29+
30+
private native void OpenCVdetector(long imageGray, long faces);
31+
private native void loadResources();
32+
}

FaceTracker/app/src/main/java/org/opencv/android/facetracker/OpenCvActivity.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package org.opencv.android.facetracker;
22

3+
34
import android.content.Intent;
5+
46
import android.os.Bundle;
57
import android.support.v7.app.AppCompatActivity;
68
import android.view.View;
79
import android.widget.Button;
810

11+
912
import com.google.android.gms.samples.vision.face.facetracker.FaceTrackerActivity;
1013
import com.google.android.gms.samples.vision.face.facetracker.R;
1114

15+
1216
public class OpenCvActivity extends AppCompatActivity {
1317
private static final String TAG = "OpenCvActivity";
1418
private Button mBtnDetect;
1519

20+
1621
@Override
1722
public void onCreate(Bundle icicle) {
1823
super.onCreate(icicle);
@@ -28,5 +33,4 @@ public void onClick(View v) {
2833
}
2934
});
3035
}
31-
3236
}

FaceTracker/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# The setting is particularly useful for tweaking memory settings.
1212
# Default value: -Xmx10248m -XX:MaxPermSize=256m
1313
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14-
14+
org.gradle.jvmargs=-Xmx2048m
1515
# When configured, Gradle will run in incubating parallel mode.
1616
# This option should only be used with decoupled projects. More details, visit
1717
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects

FaceTracker/settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
include ':app'
2+
include ':openCVLibrary330'

0 commit comments

Comments
 (0)