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;
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 * –
@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
@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