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