OpenCV marker detection successfully ported.
This commit is contained in:
@@ -31,6 +31,7 @@
|
|||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:icon="@drawable/ic_launcher"
|
android:icon="@drawable/ic_launcher"
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
#include "marker.hpp"
|
#include "marker.hpp"
|
||||||
|
|
||||||
#define CAN_LOG
|
//#define CAN_LOG
|
||||||
|
|
||||||
extern "C"{
|
extern "C"{
|
||||||
#ifdef CAN_LOG
|
#ifdef CAN_LOG
|
||||||
@@ -37,10 +37,8 @@ const char * TAG = "CVPROC_NATIVE";
|
|||||||
JNIEXPORT void JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_getMarkerCodesAndLocations(
|
JNIEXPORT void JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_getMarkerCodesAndLocations(
|
||||||
JNIEnv* env,
|
JNIEnv* env,
|
||||||
jobject jobj,
|
jobject jobj,
|
||||||
jint width,
|
jlong addrMatIn,
|
||||||
jint height,
|
jlong addrMatOut,
|
||||||
jbyteArray yuv,
|
|
||||||
jintArray bgra,
|
|
||||||
jintArray codes
|
jintArray codes
|
||||||
){
|
){
|
||||||
char codeMsg[128];
|
char codeMsg[128];
|
||||||
@@ -48,19 +46,12 @@ const char * TAG = "CVPROC_NATIVE";
|
|||||||
|
|
||||||
log(TAG, "Requesting native data.");
|
log(TAG, "Requesting native data.");
|
||||||
|
|
||||||
jbyte* _yuv = env->GetByteArrayElements(yuv, 0);
|
cv::Mat& myuv = *(cv::Mat*)addrMatIn;
|
||||||
jint * _bgra = env->GetIntArrayElements(bgra, 0);
|
cv::Mat& mbgr = *(cv::Mat*)addrMatOut;
|
||||||
jint * _codes = env->GetIntArrayElements(codes, 0);
|
jint * _codes = env->GetIntArrayElements(codes, 0);
|
||||||
|
|
||||||
log(TAG, "Converting native data to OpenCV Mats.");
|
|
||||||
|
|
||||||
cv::Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
|
|
||||||
cv::Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
|
|
||||||
|
|
||||||
log(TAG, "Converting color space before processing.");
|
log(TAG, "Converting color space before processing.");
|
||||||
cv::Mat mbgr(height, width, CV_8UC3);
|
cv::cvtColor(myuv, mbgr, CV_RGB2BGR);
|
||||||
cv::Mat gray;
|
|
||||||
cv::cvtColor(myuv, mbgr, CV_YUV420sp2BGR);
|
|
||||||
|
|
||||||
log(TAG, "Finding markers.");
|
log(TAG, "Finding markers.");
|
||||||
nxtar::getAllMarkers(vCodes, mbgr);
|
nxtar::getAllMarkers(vCodes, mbgr);
|
||||||
@@ -73,14 +64,8 @@ const char * TAG = "CVPROC_NATIVE";
|
|||||||
}
|
}
|
||||||
vCodes.clear();
|
vCodes.clear();
|
||||||
|
|
||||||
log(TAG, "Converting color space after processing.");
|
|
||||||
cv::cvtColor(mbgr, gray, CV_BGR2GRAY);
|
|
||||||
cv::cvtColor(gray, mbgra, CV_GRAY2BGRA, 4);
|
|
||||||
|
|
||||||
log(TAG, "Releasing native data.");
|
log(TAG, "Releasing native data.");
|
||||||
|
|
||||||
env->ReleaseIntArrayElements(codes, _codes, 0);
|
env->ReleaseIntArrayElements(codes, _codes, 0);
|
||||||
env->ReleaseIntArrayElements(bgra, _bgra, 0);
|
|
||||||
env->ReleaseByteArrayElements(yuv, _yuv, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,11 +16,13 @@
|
|||||||
package ve.ucv.ciens.ccg.nxtar;
|
package ve.ucv.ciens.ccg.nxtar;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
|
|
||||||
import org.opencv.android.BaseLoaderCallback;
|
import org.opencv.android.BaseLoaderCallback;
|
||||||
import org.opencv.android.LoaderCallbackInterface;
|
import org.opencv.android.LoaderCallbackInterface;
|
||||||
import org.opencv.android.OpenCVLoader;
|
import org.opencv.android.OpenCVLoader;
|
||||||
|
import org.opencv.android.Utils;
|
||||||
|
import org.opencv.core.Mat;
|
||||||
|
import org.opencv.imgproc.Imgproc;
|
||||||
|
|
||||||
import ve.ucv.ciens.ccg.nxtar.interfaces.CVProcessor;
|
import ve.ucv.ciens.ccg.nxtar.interfaces.CVProcessor;
|
||||||
import ve.ucv.ciens.ccg.nxtar.interfaces.MulticastEnabler;
|
import ve.ucv.ciens.ccg.nxtar.interfaces.MulticastEnabler;
|
||||||
@@ -28,8 +30,8 @@ import ve.ucv.ciens.ccg.nxtar.interfaces.Toaster;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.graphics.Bitmap.CompressFormat;
|
import android.graphics.Bitmap.CompressFormat;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.net.wifi.WifiManager.MulticastLock;
|
import android.net.wifi.WifiManager.MulticastLock;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -53,14 +55,14 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica
|
|||||||
private BaseLoaderCallback loaderCallback;
|
private BaseLoaderCallback loaderCallback;
|
||||||
private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
|
||||||
static{
|
/*static{
|
||||||
System.loadLibrary("cvproc");
|
if (!OpenCVLoader.initDebug()){
|
||||||
/*if (!OpenCVLoader.initDebug()){
|
|
||||||
Gdx.app.exit();
|
Gdx.app.exit();
|
||||||
}*/
|
}
|
||||||
}
|
System.loadLibrary("cvproc");
|
||||||
|
}*/
|
||||||
|
|
||||||
public native void getMarkerCodesAndLocations(int w, int h, byte[] yuv, int[] rgba, int[] codes);
|
public native void getMarkerCodesAndLocations(long inMat, long outMat, int[] codes);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState){
|
public void onCreate(Bundle savedInstanceState){
|
||||||
@@ -89,6 +91,7 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica
|
|||||||
public void onManagerConnected(int status){
|
public void onManagerConnected(int status){
|
||||||
switch(status){
|
switch(status){
|
||||||
case LoaderCallbackInterface.SUCCESS:
|
case LoaderCallbackInterface.SUCCESS:
|
||||||
|
System.loadLibrary("cvproc");
|
||||||
ocvOn = true;
|
ocvOn = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -150,16 +153,21 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica
|
|||||||
public CVData processFrame(byte[] frame, int w, int h) {
|
public CVData processFrame(byte[] frame, int w, int h) {
|
||||||
if(ocvOn){
|
if(ocvOn){
|
||||||
int codes[] = new int[15];
|
int codes[] = new int[15];
|
||||||
int [] pData = new int[w * h];
|
Bitmap tFrame, mFrame;
|
||||||
Bitmap mFrame = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
|
|
||||||
Bitmap tFrame = BitmapFactory.decodeByteArray(frame, 0, frame.length);
|
|
||||||
ByteBuffer buffer = ByteBuffer.allocate(tFrame.getByteCount());
|
|
||||||
|
|
||||||
tFrame.copyPixelsToBuffer(buffer);
|
tFrame = BitmapFactory.decodeByteArray(frame, 0, frame.length);
|
||||||
|
|
||||||
getMarkerCodesAndLocations(w, h, buffer.array(), pData, codes);
|
Mat inImg = new Mat();
|
||||||
|
Mat outImg = new Mat();
|
||||||
|
Utils.bitmapToMat(tFrame, inImg);
|
||||||
|
|
||||||
mFrame.setPixels(pData, 0, w, 0, 0, w, h);
|
getMarkerCodesAndLocations(inImg.getNativeObjAddr(), outImg.getNativeObjAddr(), codes);
|
||||||
|
|
||||||
|
Mat temp = new Mat();
|
||||||
|
Imgproc.cvtColor(outImg, temp, Imgproc.COLOR_BGR2RGB);
|
||||||
|
|
||||||
|
mFrame = Bitmap.createBitmap(temp.cols(), temp.rows(), Bitmap.Config.RGB_565);
|
||||||
|
Utils.matToBitmap(temp, mFrame);
|
||||||
mFrame.compress(CompressFormat.JPEG, 100, outputStream);
|
mFrame.compress(CompressFormat.JPEG, 100, outputStream);
|
||||||
|
|
||||||
CVData data = new CVData();
|
CVData data = new CVData();
|
||||||
|
Reference in New Issue
Block a user