8
我有一个OpenCV Android应用程序。它的大部分代码都是用Java编写的,但我有一个功能是C中的 。 函数获取一个Mat对象并返回一个新对象。从本地代码返回Mat对象到OpenCV中的java
我的问题是如何从本地代码返回一个Mat到Java? 找不到任何示例。
谢谢。
我有一个OpenCV Android应用程序。它的大部分代码都是用Java编写的,但我有一个功能是C中的 。 函数获取一个Mat对象并返回一个新对象。从本地代码返回Mat对象到OpenCV中的java
我的问题是如何从本地代码返回一个Mat到Java? 找不到任何示例。
谢谢。
今天我不得不从本机代码返回一个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;
嗨堆垛机,改变了我的本地代码这样:垫*图像=(太*)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
@SaqibRazaq签名是'void medianBlur(const Mat&src,Mat&dst,int ksize)''''''''''''''''''''''''你需要用一个引用来处理它。尝试'&处理'。或者将其定义为'Mat&processing(image.size(),CV_8UC3);' – stacker 2012-04-10 06:07:04
@SaqibRazaq如果你想返回'Mat&dst',那么你应该在你的java代码中声明它并将它添加到JNI方法的调用中与添加'image'相同的方式。 – stacker 2012-04-10 06:12:35