2012-03-30 9 views
8

Tengo una aplicación para Android OpenCV. La mayor parte de su código está en Java pero tengo una función que está en C. La función obtiene un objeto Mat y devuelve uno nuevo.Devolución del objeto Mat del código nativo a java en OpenCV

Mi pregunta es ¿cómo devuelvo una Mat del código nativo a Java? No se pudo encontrar ningún ejemplo de eso.

Gracias.

Respuesta

20

Hoy tuve que devolver una Mat del código nativo. Empecé con "Tutorial 2 Avanzado - 2. Mezclar Java + Nativo OpenCV" ya pasa dos objetos Mat (Imágenes capturadas desde la cámara) al código nativo. Pero quería volver característica extraída, por tanto, he añadido a la firma jlong addrDescriptor:

extern "C" { 
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4View_FindFeatures(JNIEnv* env, jobject thiz, jlong addrGray, jlong addrRgba, jlong addrDescriptor) 
{ 
    Mat* pMatGr=(Mat*)addrGray; 
    Mat* pMatRgb=(Mat*)addrRgba; 
    Mat* pMatDesc=(Mat*)addrDescriptor; 
    vector<KeyPoint> v; 

    //OrbFeatureDetector detector(50); 
    OrbFeatureDetector detector; 
    OrbDescriptorExtractor extractor; 
    detector.detect(*pMatGr, v); 
    extractor.compute(*pMatGr, v, *pMatDesc); 
    circle(*pMatRgb, Point(100,100), 10, Scalar(5,128,255,255)); 
    for(size_t i = 0; i < v.size(); i++) { 
     circle(*pMatRgb, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(255,128,0,255)); 
    } 
    } 
} 

En la parte java he añadido el Mat

private Mat descriptor; 
descriptor = new Mat(); 

El método getNativeObjAddr() hace el truco. El Mat se asigna en Java y su dirección se pasa al código nativo, por lo tanto, no hay ningún retorno explícito.

FindFeatures(mGraySubmat.getNativeObjAddr(), mRgba.getNativeObjAddr(), descriptor.getNativeObjAddr()); 
Log.i("desc:" , descriptor.dump()); 

La alfombra estaba llena con los datos requeridos y es accesible directamente en el código de Java después de las declaraciones de invocación JNI.

a otro lugar en el código de la estera se libera:

if (descriptor != null) 
    descriptor.release(); 
descriptor = null; 
+0

Hola apilador, cambió mi código nativo para esto: * Mat imagen = (Mat *) addrDescriptor; \t Procesamiento de Mat (* image.size(), CV_8UC3); \t cv :: medianBlur (* imagen, procesamiento, 5); Ahora aparece el siguiente mensaje de error: jni/objDetector.cpp: 23: error: solicitud de miembro 'tamaño' en 'imagen', que es de tipo no de clase 'cv :: Mat * –

+0

@SaqibRazaq la firma es 'nulo medianBlur (const Mat & src, Mat & dst, int ksize) 'necesita invocarlo con una referencia al procesamiento. prueba '& processing'. O defínalo como 'Mat & processing (image.size(), CV_8UC3);' – stacker

+0

@SaqibRazaq Si desea devolver 'Mat & dst', entonces debe declararlo en su código java y agregarlo a la invocación del método JNI. De la misma forma en que agregó 'image'. – stacker

Cuestiones relacionadas