在OpenCV中将Mat对象从本机代码返回到java

我有一个OpenCV Android应用程序。 它的大部分代码是用Java编写的,但是我有一个用C语言编写的函数。函数获取一个Mat对象并返回一个新对象。

我的问题是如何从原生代码返回到Java? 找不到任何这样的例子。

谢谢。

Solutions Collecting From Web of "在OpenCV中将Mat对象从本机代码返回到java"

今天我必须从本地代码返回一个Mat。 我从“教程2高级 – 2.混合Java +本机OpenCV”开始,它已经将两个Mat(从相机捕获的图像)对象传递给本机代码。 但我想返回提取的function,因此我添加了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)); } } } 

在Java部分,我添加了Mat

 private Mat descriptor; descriptor = new Mat(); 

方法getNativeObjAddr()有窍门。 Mat是在java中分配的,它的地址被传递给本地代码,因此没有任何明确的返回。

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

Mat填充了所需的数据,在JNI调用返回后可以直接在java代码中访问。

Mat的其他地方发布:

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