将 OpenCv Mat 对象从 Java 传递给 C Native
Passing OpenCv Mat Object From Java to C Native
我正在尝试通过 opencv 读取图像,然后将其从 java 语言传递到我用 C 语言而非 C++ 编写的本机库。
我正在使用 JNI 函数,我已经看到许多使用 Mat 对象的 C++ 代码示例。
但我的问题是 "C Language" 中没有任何 Mat 对象,而我拥有的唯一对象是 CvMat.So 当我在我的本机代码中获取我的图像时,它是一个错误的图像。
我应该提一下,由于很多原因我不能使用 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);
}
所以不要传递整个 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;
如果矩阵类型 and/or 矩阵大小可能不同,请在另一个参数中传递附加信息。如果矩阵类型始终相同,请对其进行硬编码并仅传递指向数据的指针。
然后根据这些数据构建新的Mat
。
我从来没有写过 Java 行,我为此感到自豪 - 无论如何我知道没有指针。我发现你可以使用 get()
方法
myClass.getImg(img.get(0, 0)); // Beginning of the array
或您提到的getNativeObjAddr()
方法
myClass.getImg(img.getNativeObjAddr());
您的解决方案无法工作并调用未定义的行为,因为 cvMat
和 Mat
是完全不同的类型。
我正在尝试通过 opencv 读取图像,然后将其从 java 语言传递到我用 C 语言而非 C++ 编写的本机库。 我正在使用 JNI 函数,我已经看到许多使用 Mat 对象的 C++ 代码示例。 但我的问题是 "C Language" 中没有任何 Mat 对象,而我拥有的唯一对象是 CvMat.So 当我在我的本机代码中获取我的图像时,它是一个错误的图像。 我应该提一下,由于很多原因我不能使用 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);
}
所以不要传递整个 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;
如果矩阵类型 and/or 矩阵大小可能不同,请在另一个参数中传递附加信息。如果矩阵类型始终相同,请对其进行硬编码并仅传递指向数据的指针。
然后根据这些数据构建新的Mat
。
我从来没有写过 Java 行,我为此感到自豪 - 无论如何我知道没有指针。我发现你可以使用 get()
方法
myClass.getImg(img.get(0, 0)); // Beginning of the array
或您提到的getNativeObjAddr()
方法
myClass.getImg(img.getNativeObjAddr());
您的解决方案无法工作并调用未定义的行为,因为 cvMat
和 Mat
是完全不同的类型。