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:
- ¿Cómo puedo detectar mejor los diferentes colores LED con la cámara de un teléfono Android y OpenCV?
- Javacv: la aplicación termina con opencv_contrib.createLBPHFaceRecognizer
- Visión por ordenador - filtración de cascos convexos y defectos de convexidad con OpenCV
- OpenCv en Android: detección de puntos clave en imágenes de archivo
- Comparación de imágenes de OpenCV en Android
#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.
- Falló la aserción de OpenCV nMatToBitmap
- Cómo utilizar compilación OpenCV recompilada para Android
- Obtener coordenadas de líneas no geométricas en una imagen binaria
- Utilizar NDK en Android Studio (OpenCV)
- Android no puede cargar la imagen orientada correcta desde la galería
- En la transformación Circle Hough, ¿cuál es la razón inversa de la resolución del acumulador (dp) y cómo afecta la detección de círculos?
- Usando OpenCV para analizar datos de geles de proteínas
- Aplicación de Android que utiliza tecnología de reconocimiento de imagen
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 enviar el archivo usando bluetooth en android programatically?
- Formato de texto del mercado de Android