2012-03-30 35 views
8

Tôi có một ứng dụng Android OpenCV. Hầu hết các mã của nó là trong Java nhưng tôi có một chức năng trong C. Hàm nhận đối tượng Mat và trả về một đối tượng mới.Trả về đối tượng Mat từ mã gốc sang java trong OpenCV

Câu hỏi của tôi là làm cách nào để trả lại một Mat từ mã gốc sang Java? Không thể tìm thấy bất kỳ ví dụ nào về điều đó.

Cảm ơn.

Trả lời

20

Hôm nay tôi phải trả lại Mat từ mã gốc. Tôi bắt đầu với "Hướng dẫn 2 nâng cao - 2. Trộn Java + Native OpenCV" nó đã chuyển hai đối tượng Mat (Ảnh được chụp từ máy ảnh) vào mã gốc. Nhưng tôi muốn quay trở lại tính năng trích xuất, do đó tôi đã thêm jlong addrDescriptor để chữ ký:

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

Trong phần java Tôi được thêm vào Mat

private Mat descriptor; 
descriptor = new Mat(); 

Phương pháp getNativeObjAddr() hiện các trick. Mat được cấp phát trong java và địa chỉ của nó được chuyển tới mã gốc, do đó không có bất kỳ sự trở lại rõ ràng nào.

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

Mat được điền đầy đủ dữ liệu bắt buộc và có thể truy cập trực tiếp vào mã java sau khi trả về JNI.

somwhere khác trong mã Mat được phát hành:

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

Hi stacker, thay đổi mã mẹ đẻ của tôi như thế này: Mat * image = (Mat *) addrDescriptor; \t Chế biến mat (* image.size(), CV_8UC3); \t cv :: medianBlur (* hình ảnh, chế biến, 5); Bây giờ tôi nhận được thông báo lỗi sau: jni/objDetector.cpp: 23: lỗi: yêu cầu kích thước thành viên 'trong' hình ảnh ', không thuộc loại' cv :: Mat * –

+0

@SaqibRazaq chữ ký là 'void medianBlur (const Mat & src, Mat & dst, int ksize) 'bạn cần gọi nó với tham chiếu đến xử lý. thử '& xử lý'. Hoặc định nghĩa nó là 'Mat & processing (image.size(), CV_8UC3);' – stacker

+0

@SaqibRazaq Nếu bạn muốn trả về 'Mat & dst', thì bạn nên khai báo nó trong mã java của bạn và thêm nó vào lời gọi của phương thức JNI giống như cách bạn đã thêm 'hình ảnh'. – stacker

Các vấn đề liên quan