Uso de funciones nativas en Android con OpenCV

Quiero usar OpenCV + Android, usando funciones nativas. Sin embargo estoy un poco confundido cómo utilizar bitmaps como parámetros y cómo devolver un valor de un mapa de bits editado (o Mat).

Por ejemplo, tengo una función nativa:

#include <jni.h> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> JNIEXPORT ??? JNICALL Java_com_my_package_name_and_javaclass_myFunction(JNIEnv* env, jobject javaThis, cv::Mat mat1){ //here will be code to perform filtering, blurring, canny edge detection or similar things. //so I want to input a bitmap, edit it and send it back to the Android class. return ??? } 

Así que aquí estoy usando cv :: Mat como un parámetro. Sé que esto es incorrecto, pero no estoy seguro de lo que debería ser, y lo que debería estar en la clase java de correpsonding. ¿Debe ser un ByteArray? Y entonces en la función nativa anterior el parámetro sería jByteArray (o similar)?

Y para el objeto de retorno, ¿qué debo poner? ¿Debe ser una matriz?

Básicamente lo que estoy buscando es en la clase Java que tengo un Mat (o Bitmap) lo envío a la función nativa para editar y devolver un bitmap muy bien editado.

Este es el código OpenCV Tutorial para Android. Recuerdo que me tomó un tiempo entender la convención de la JNI. Solo mira primero el código JNI

 #include <jni.h> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/features2d/features2d.hpp> #include <vector> using namespace std; using namespace cv; extern "C" { JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3View_FindFeatures(JNIEnv* env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray bgra) { jbyte* _yuv = env->GetByteArrayElements(yuv, 0); jint* _bgra = env->GetIntArrayElements(bgra, 0); Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv); Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra); Mat mgray(height, width, CV_8UC1, (unsigned char *)_yuv); //Please make attention about BGRA byte order //ARGB stored in java as int array becomes BGRA at native level cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4); vector<KeyPoint> v; FastFeatureDetector detector(50); detector.detect(mgray, v); for( size_t i = 0; i < v.size(); i++ ) circle(mbgra, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(0,0,255,255)); env->ReleaseIntArrayElements(bgra, _bgra, 0); env->ReleaseByteArrayElements(yuv, _yuv, 0); } } 

y luego código Java

 package org.opencv.samples.tutorial3; import android.content.Context; import android.graphics.Bitmap; class Sample3View extends SampleViewBase { public Sample3View(Context context) { super(context); } @Override protected Bitmap processFrame(byte[] data) { int frameSize = getFrameWidth() * getFrameHeight(); int[] rgba = new int[frameSize]; FindFeatures(getFrameWidth(), getFrameHeight(), data, rgba); Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888); bmp.setPixels(rgba, 0/* offset */, getFrameWidth() /* stride */, 0, 0, getFrameWidth(), getFrameHeight()); return bmp; } public native void FindFeatures(int width, int height, byte yuv[], int[] rgba); static { System.loadLibrary("native_sample"); } } 

Es mejor que lea las pruebas predeterminadas de OpenCV para Android (nativo).

Por supuesto, no se puede utilizar cv::Mat como parámetro, porque esto es c ++ clase no java. Sin embargo, si no me equivoco, puede llamar a métodos de clase c ++ desde java source (también forma parte de JNI).

En tu situación tienes que usar un puntero a los datos de la imagen (puede ser uchar* o int* en c ++, es igual que byte[] o int[] en java). Por ejemplo, puede obtener píxeles de Android Bitmap utilizando el método getPixels . Y en C + + puede utilizar un constructor de estera específico que lleva un puntero a los datos de la imagen:

 // constructor for matrix headers pointing to user-allocated data Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP); Mat(Size _size, int _type, void* _data, size_t _step=AUTO_STEP); 

Espero eso ayude.

  • ¿Cómo utilizar Java con NDK Android?
  • Android Studio 1.5 Opencv 3.0.0 calibración de la cámara de muestra se estrelló
  • Captura de vista previa de la cámara para su uso en OpenCV. Conversión a RGB y Mat Gris. Java. Androide
  • Cambiar el color de un objeto en una aplicación de Android
  • Cortar la imagen después de seleccionar el área mediante la detección de bordes en android
  • Eclipse da error al usar GaussianBlur con OpenCV para Android
  • ¿Cuál es la diferencia entre `opencv.android.JavaCameraView` y` opencv.android.NativeCameraView`
  • Cómo obtener efecto de color mágico como escáner de cámara utilizando OpenCV
  • OpenCV para ANDROID comparar imagen
  • El círculo de Hough no detecta los ojos del iris
  • Cómo integrar OpenCV Manager en la aplicación para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.