2012-03-30 14 views

Odpowiedz

20

Dzisiaj musiałem zwrócić Mat z natywnego kodu. Zacząłem od "Tutorial 2 Advanced - 2. Mix Java + Native OpenCV", który już przekazuje dwa obiekty Mat (Images capture from camera) do natywnego kodu. Ale chciałem wrócić wyodrębnione funkcji, więc dodałem jlong addrDescriptor z podpisem:

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)); 
    } 
    } 
} 

W części java I dodaje Mat

private Mat descriptor; 
descriptor = new Mat(); 

Metoda getNativeObjAddr() załatwia sprawę. Mata jest przydzielana w języku Java, a jej adres jest przekazywany do kodu natywnego, dlatego nie ma żadnego wyraźnego powracania.

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

Mat wypełniono wymaganych danych i jest dostępny bezpośrednio w kodzie java po invokation zwrotów JNI.

Gdzieś indziej w kodzie mata jest zwolniony:

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

Hi dyszlem, zmieniłem natywnego kodu do tego: Mat * image = (Mat *) addrDescriptor; \t Przetwarzanie mat (* image.size(), CV_8UC3); \t cv :: medianBlur (* obraz, przetwarzanie, 5); Teraz pojawia się następujący komunikat o błędzie: jni/objDetector.cpp: 23: error: request dla elementu 'size' w 'image', który jest typu nieklasy 'cv :: Mat * –

+0

@SaqibRazaq podpis jest' void medianBlur (const Mat & src, Mat & dst, int ksize) 'musisz wywołać go z odniesieniem do przetwarzania. spróbuj '& processing'. Lub zdefiniuj go jako 'Mat & processing (image.size(), CV_8UC3);' – stacker

+0

@SaqibRazaq Jeśli chcesz zwrócić 'Mat & dst', powinieneś zadeklarować go w swoim kodzie java i dodać go do wywołania metody JNI w ten sam sposób, w jaki dodałeś 'image'. – stacker