我有一个opencvandroid应用程序。它的大部分代码是用java编写的,但我有一个函数是用c编写的。函数获取一个mat对象并返回一个新对象。我的问题是如何将mat从本机代码返回到java?找不到这样的例子。谢谢。
u0sqgete1#
今天我必须归还一张来自本机代码的垫子。我从“教程2高级-2”开始。mixjava+nativeopencv“它已经将两个mat(从相机捕获的图像)对象传递给本机代码。但我想返回提取的特征,因此我补充说 jlong addrDescriptor 签字人:
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分配的,它的地址被传递给本机代码,因此没有任何显式返回。
getNativeObjAddr()
FindFeatures(mGraySubmat.getNativeObjAddr(), mRgba.getNativeObjAddr(), descriptor.getNativeObjAddr()); Log.i("desc:" , descriptor.dump());
mat中填充了所需的数据,在jni调用返回后可以在java代码中直接访问。在代码的其他地方释放mat:
if ( descriptor != null) descriptor.release(); descriptor = null;
bzzcjhmw2#
在c中++
jlong funC(){ Mat *mat = new Mat(); //... return (jlong)mat; }
在java中:
long = addr;// addr is return from c method funC() Mat mat = new Mat(addr);
注意:如果您的代码是:mat mat(),则必须在c中使用new mat();func()结束时将收集mat对象内存。
2条答案
按热度按时间u0sqgete1#
今天我必须归还一张来自本机代码的垫子。我从“教程2高级-2”开始。mixjava+nativeopencv“它已经将两个mat(从相机捕获的图像)对象传递给本机代码。但我想返回提取的特征,因此我补充说
jlong addrDescriptor
签字人:在java部分,我添加了mat
方法
getNativeObjAddr()
有办法。mat是用java分配的,它的地址被传递给本机代码,因此没有任何显式返回。mat中填充了所需的数据,在jni调用返回后可以在java代码中直接访问。
在代码的其他地方释放mat:
bzzcjhmw2#
在c中++
在java中:
注意:如果您的代码是:mat mat(),则必须在c中使用new mat();func()结束时将收集mat对象内存。