2012-03-30 3 views
8

OpenCV Android 앱이 있습니다. 그 코드의 대부분은 Java이지만, 나는 에있는 함수 중 하나입니다. 이 함수는 Mat 객체를 가져 와서 새로운 것을 반환합니다.OpenCV에서 원시 코드에서 Java로 Mat 객체 반환하기

제 질문은 어떻게 원시 코드에서 Java로 매트를 반환합니까? 예를 찾을 수 없습니다.

감사합니다.

답변

20

오늘은 원시 코드에서 Mat를 반환해야했습니다. "튜토리얼 2 고급 - 2. Mix Java + Native OpenCV"로 시작하여 이미 두 개의 매트 (카메라에서 캡처 한 이미지) 객체를 원시 코드로 전달합니다. 하지만 추출 된 특징을 반환하고 싶었 때문에 내가 서명에 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)); 
    } 
    } 
} 

을 자바 부분에서 나는 매트

private Mat descriptor; 
descriptor = new Mat(); 

트릭을 수행 getNativeObjAddr() 방법을 추가했습니다. 매트는 자바로 할당되고 주소는 네이티브 코드로 전달되므로 명시 적으로 반환되지 않습니다.

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

매트는 필요한 데이터로 채워졌으며 JNI 호출이 반환 된 후 Java 코드에서 직접 액세스 할 수 있습니다. 매트가 해제 코드에서 다른

Somwhere :

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

안녕 스태커이 내 네이티브 코드를 변경 : 매트 * 이미지 = (마 *) addrDescriptor; \t 매트 처리 (* image.size(), CV_8UC3); \t cv :: medianBlur (* image, processing, 5); 이제 다음과 같은 오류 메시지가 나타납니다. jni/objDetector.cpp : 23 : 오류 : 'image'의 'image'멤버 'size'요청 (비 클래스 유형 임) 'Cv :: Mat * –

+0

@SaqibRazaq 서명이 void입니다. medianBlur (const Mat & src, Mat & dst, int ksize)'처리를 참조하여 호출해야합니다. '& processing'을 시도하십시오. 아니면'Mat & processing (image.size(), CV_8UC3);으로 정의한다. – stacker

+0

@SaqibRazaq'Mat & dst'를 반환하려면 자바 코드에서 선언하고 JNI 메소드의 호출에 추가해야한다. 당신이'이미지'를 추가 한 것과 같은 방식으로. – stacker

관련 문제