我在 JNI cpp 文件中生成了以下方法,
JNIEXPORT void JNICALL Java_com_idesign_opencvmaketest_MainActivity_train
(JNIEnv *env, jobject thisObj, jobjectArray images, jobjectArray labels) {
Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();
/** make a call to
* CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels) = 0;
**/
model->train(images, labels);
}
现在我得到了
Parameter type mismatch: Types 'const _InputArray' and 'jobjectArray' are not compatible
在 model->train(images, labels); 中的
images
和 labels
;
那么 MainActivity_train
方法中图像和标签的参数类型是什么?
以及如何使用正确的参数类型从 Java 类调用此 JNI 方法?
我是 OpenCv 和 JNI 的新手。
最佳答案
jobjectArray
不是 Mat
. org.opencv.core.Mat
类有一个 getNativeObjAddr()
返回类型为 long
的方法,可以解释为指向 Mat
的指针.有关 OpenCV Java API 的更多信息 here , 示例代码 here .
方法
CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels)
接受 std::vector<cv::Mat> images
作为来源和 std::vector<int> lables
作为标签。据我所知,您需要将不止一张图片传递给您的 JNI
方法。参见示例 here .
JNIEXPORT void JNICALL Java_com_idesign_opencvmaketest_MainActivity_train
(JNIEnv *env, jobject thisObj, jlong images, jlong labels) {
Mat& matImage = *(Mat*)images; //to create one Mat image, you need an array of Mat
Mat& matLabels = *(Mat*)labels; // create a Mat from labels
/*
To pass correct parameters, you would do:
std::vector<cv::Mat> vecImages;
vecImages.push_back(matImage);
std::vector<int> vecLabels;
//put your labels to vecLabels here
model->train(vecImages,vecLabels);
*/
Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();
/** make a call to
* CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels) = 0;
**/
model->train(matImages, matLabels); // function requires ArrayofMats and ArrayofInts
}
关于java - 将 InputArrayOfArrays 从 java 类传递到 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46111034/