2012-03-30 28 views
8

我有一个OpenCV Android应用程序。它的大部分代码都是用Java编写的,但我有一个功能是C中的 。 函数获取一个Mat对象并返回一个新对象。从本地代码返回Mat对象到OpenCV中的java

我的问题是如何从本地代码返回一个Mat到Java? 找不到任何示例。

谢谢。

回答

20

今天我不得不从本机代码返回一个Mat。我从“教程2高级 - 2.混合Java +本机OpenCV”开始,它已经将两个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部分我加了垫

private Mat descriptor; 
descriptor = new Mat(); 

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

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

该Mat被填充了所需的数据,并且可以在JNI invokation返回后直接在java代码中访问。

Somwhere别人的代码中的垫被释放:

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

嗨堆垛机,改变了我的本地代码这样:垫*图像=(太*)addrDescriptor; \t Mat处理(* image.size(),CV_8UC3); \t cv :: medianBlur(* image,processing,5);现在我收到以下错误消息:jni/objDetector.cpp:23:error:'image'中的成员'size'的请求,它是非类的类型'cv :: Mat * – 2012-04-10 04:41:05

+0

@SaqibRazaq签名是'void medianBlur(const Mat&src,Mat&dst,int ksize)''''''''''''''''''''''''你需要用一个引用来处理它。尝试'&处理'。或者将其定义为'Mat&processing(image.size(),CV_8UC3);' – stacker 2012-04-10 06:07:04

+0

@SaqibRazaq如果你想返回'Mat&dst',那么你应该在你的java代码中声明它并将它添加到JNI方法的调用中与添加'image'相同的方式。 – stacker 2012-04-10 06:12:35