2012-03-30 68 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