在opencv中将mat对象从本机代码返回到java

8ehkhllq  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(393)

我有一个opencvandroid应用程序。它的大部分代码是用java编写的,但我有一个函数是用c编写的。函数获取一个mat对象并返回一个新对象。
我的问题是如何将mat从本机代码返回到java?找不到这样的例子。
谢谢。

u0sqgete

u0sqgete1#

今天我必须归还一张来自本机代码的垫子。我从“教程2高级-2”开始。mixjava+nativeopencv“它已经将两个mat(从相机捕获的图像)对象传递给本机代码。但我想返回提取的特征,因此我补充说 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;
bzzcjhmw

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对象内存。

相关问题