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

标签 java c opencv java-native-interface

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

我的 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;

如果矩阵类型和/或矩阵大小可能不同,请在另一个参数中传递附加信息。如果矩阵的类型始终相同,请对其进行硬编码并仅传递指向数据的指针。

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

我从来没有写过一行 Java,我为此感到自豪 - 无论如何我知道没有指针。我发现你可以使用 get() 方法

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

或您提到的 getNativeObjAddr() 方法

myClass.getImg(img.getNativeObjAddr());

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

关于java - 将 OpenCv Mat 对象从 Java 传递到 C Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53904449/

相关文章:

java - 在 Array 与 ArrayList 中转换对象并调用该对象的方法

c - 如何在C中一次清除多个位?

c - printf 改变了我的输出

c - RobuSTLy 以亚像素精度找到图像 block 的局部最大值

java - 如何在 ConstraintValidator 中执行 @Entity 查询

java - Android 数据绑定(bind)生成非 UTF-8 编码的文件

python - cv2.videoCapture.release() 是什么意思?

c++ - OpenCV 计算房间里的人数

java - Retrofit2 如何获取重定向网址 @HEAD ("/")

C++/C : Prepend length to Char[] in bytes (binary/hex)