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;
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 * –
@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
@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