diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2ed440f..e016e34 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -31,6 +31,7 @@ + GetByteArrayElements(yuv, 0); - jint * _bgra = env->GetIntArrayElements(bgra, 0); + cv::Mat& myuv = *(cv::Mat*)addrMatIn; + cv::Mat& mbgr = *(cv::Mat*)addrMatOut; 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."); - cv::Mat mbgr(height, width, CV_8UC3); - cv::Mat gray; - cv::cvtColor(myuv, mbgr, CV_YUV420sp2BGR); + cv::cvtColor(myuv, mbgr, CV_RGB2BGR); log(TAG, "Finding markers."); nxtar::getAllMarkers(vCodes, mbgr); @@ -73,14 +64,8 @@ const char * TAG = "CVPROC_NATIVE"; } 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."); env->ReleaseIntArrayElements(codes, _codes, 0); - env->ReleaseIntArrayElements(bgra, _bgra, 0); - env->ReleaseByteArrayElements(yuv, _yuv, 0); } } diff --git a/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java b/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java index 3aa3988..932ba51 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java +++ b/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java @@ -16,11 +16,13 @@ package ve.ucv.ciens.ccg.nxtar; import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; 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.MulticastEnabler; @@ -28,8 +30,8 @@ import ve.ucv.ciens.ccg.nxtar.interfaces.Toaster; import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Bitmap.CompressFormat; +import android.graphics.BitmapFactory; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.MulticastLock; import android.os.Bundle; @@ -53,14 +55,14 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica private BaseLoaderCallback loaderCallback; private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - static{ - System.loadLibrary("cvproc"); - /*if (!OpenCVLoader.initDebug()){ + /*static{ + if (!OpenCVLoader.initDebug()){ 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 public void onCreate(Bundle savedInstanceState){ @@ -89,6 +91,7 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica public void onManagerConnected(int status){ switch(status){ case LoaderCallbackInterface.SUCCESS: + System.loadLibrary("cvproc"); ocvOn = true; break; default: @@ -150,16 +153,21 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica public CVData processFrame(byte[] frame, int w, int h) { if(ocvOn){ int codes[] = new int[15]; - int [] pData = new int[w * h]; - Bitmap mFrame = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - Bitmap tFrame = BitmapFactory.decodeByteArray(frame, 0, frame.length); - ByteBuffer buffer = ByteBuffer.allocate(tFrame.getByteCount()); + Bitmap tFrame, mFrame; - 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); CVData data = new CVData();