forked from mWater/mWater-Android-App
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjni_part.cpp
92 lines (66 loc) · 2.43 KB
/
jni_part.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdarg.h>
#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>
#include <android/log.h>
#include <android/bitmap.h>
#include "imagefuncs.h"
#define APPNAME "ca.ilanguage.rhok.imageupload"
#define OUTPUT_PIPELINE 1
using namespace cv;
using namespace std;
#define PETRI_FILM_MARGIN 10
#define PETRI_FILM_USABLE_PORTION 0.95
#define HIST_BIN_COUNT 50
//void debugimage(const char* name, Mat& image)
//{
// // put imwrite here to see debugging output of pipeline
//}
Mat process(Mat input, int& colonies) {
return findColonies(input, colonies);
}
extern "C" {
JNIEXPORT void JNICALL Java_ca_ilanguage_rhok_imageupload_ui_PetrifilmCameraView_Process(
JNIEnv* env, jobject thiz, jint width, jint height, jbyteArray yuv,
jobject bitmap) {
// Get input and output arrays
jbyte* _yuv = env->GetByteArrayElements(yuv, 0);
void* pixels;
if (AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0) {
Mat myuv(height + height / 2, width, CV_8UC1, (unsigned char *) _yuv);
Mat mbgra(height, width, CV_8UC4, (unsigned char *) pixels);
// Please pay attention to BGRA byte order
// ARGB stored in java as int array becomes BGRA at native level
cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);
createPreview(mbgra);
cvtColor(mbgra, mbgra, CV_BGRA2RGBA);
AndroidBitmap_unlockPixels(env, bitmap);
}
env->ReleaseByteArrayElements(yuv, _yuv, 0);
}
JNIEXPORT void JNICALL Java_ca_ilanguage_rhok_imageupload_PetrifilmImageProcessor_process(
JNIEnv* env, jobject thiz, jbyteArray jpeg, jobject results) {
jbyte* _jpeg = env->GetByteArrayElements(jpeg, 0);
// Open jpeg
Mat jpegdata = Mat(Size(1, env->GetArrayLength(jpeg)), CV_8UC1, _jpeg);
Mat input = imdecode(jpegdata, 1);
// Process image
int colonies = 0;
Mat processed = process(input, colonies);
// Encode jpeg
vector<uchar> encoded;
imencode(".jpg", processed, encoded);
jclass resultsClass = env->GetObjectClass(results);
jfieldID coloniesField = env->GetFieldID(resultsClass, "colonies", "I");
env->SetIntField(results, coloniesField, colonies);
jfieldID jpegField = env->GetFieldID(resultsClass, "jpeg", "[B");
jbyteArray jpegarr = env->NewByteArray(encoded.size());
env->SetByteArrayRegion(jpegarr, 0, encoded.size(),
(const signed char*) (&encoded[0]));
env->SetObjectField(results, jpegField, jpegarr);
env->DeleteLocalRef(jpegarr);
}
}