将OpenCv Mat对象从Java传递到C Native

时间:2018-12-23 14:33:26

标签: java c opencv java-native-interface

我正在尝试通过opencv读取图像,然后将其从Java语言传递到由C语言而非C ++编写的本机库。 我正在使用JNI函数,并且已经看到许多使用Mat对象的c ++代码示例。 但是我的问题是“ C语言”中没有Mat对象,而我仅有的对象是CvMat。因此,当我用本机代码获取图像时,这是错误的图像。 我应该提到由于多种原因我不能使用c ++,而C是编写本机代码的唯一选择。

我的Java代码:

Mat img = Imgcodecs.imread("./mypic.jpg", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
myClass.getImg(img.getNativeObjAddr())

我的本​​机代码:

JNIEXPORT jfloat JNICALL Java_PredictJNI_getImg
(JNIEnv *env, jobject thisObj, jlong imgPtr)
{
    CvMat* img = (CvMat*)imgPtr;
    printf("Image Width:%d:" , img->cols);
}

1 个答案:

答案 0 :(得分:0)

因此,请勿传递整个Mat结构。只需将指针传递给原始数据即可。

//uchar* ptr2imgData = dynamic_cast<uchar *>( imgPtr );
//cv::Mat img( cv::Size{ WIDTH, HEIGHT }, CV_8UC3, ptr2imgData ); // C++

uchar* ptr2imgData = (uchar *)imgPtr;  // uchar is unsigned char
CvMat* img = cvCreateMat( WIDTH, HEIGHT, CV_8UC3 );
img->ptr = imgPtr;

如果矩阵类型和/或矩阵大小可能不同,请在其他参数中传递附加信息。如果矩阵的类型始终相同,则将其保留为硬编码并仅将指针传递给数据。

然后根据这些数据构造新的Mat

我从没写过Java语言,但我为此感到骄傲-无论如何,我知道没有指针。我发现您可以使用get()方法

myClass.getImg(img.get(0, 0)); // Beginning of the array

或您提到的getNativeObjAddr()方法

myClass.getImg(img.getNativeObjAddr());

您的解决方案无法工作,并且会调用未定义的行为,因为cvMatMat是完全不同的类型。