Android ndk传递OpenCV mat到jni包含双值

Android ndk pass OpenCV mat to jni containing double values

本文关键字:jni 包含双 mat ndk 传递 OpenCV Android      更新时间:2023-10-16


我使用OpenCV4Android,我需要使用Android NDK在c++中计算一些值。在OpenCV文档中,我阅读了如何在Java和c++之间传递Mat对象,这适用于CV_8U int值。但是如果我使用Mat类型CV_64FC1填充双精度,我会得到一些奇怪的值。

有我需要的方法吗?

Java

MyNativeLib.myNativeFunction(mat.getNativeObjAddr());
c++

JNIEXPORT void JNICALL Java_de_my_package_MyNativeLib_myNativeFunction(JNIEnv *env, jlong mat_adress) {
  cv::Mat& mat = *((cv::Mat*) mat_adress);
  int i, j;
  for(int i = 0; i < mat.rows; i++) {
      for(int j = 0; j < mat.cols; j++) {
            if(i < 5 && j == 0)
                LOGI("Test output @ (%i,%i) = %f", i, j, (double) mat.data[i*mat.cols+j] );
      }
  }
}

我的输入使用CV_8U int值:

108.0
100.0
111.0
112.0
119.0

jni输出

 Test output @ (0,0) = 108.000000
 Test output @ (0,0) = 100.000000
 Test output @ (0,0) = 111.000000
 Test output @ (0,0) = 112.000000
 Test output @ (0,0) = 119.000000

我的输入垫类型为CV_64FC1

 109.32362448251978
 105.32362448251978 
 110.82362448251978
 111.32362448251978
 114.82362448251978

jni输出

 Test output @ (0,0) = 223.000000
 Test output @ (0,0) = 223.000000
 Test output @ (0,0) = 223.000000
 Test output @ (0,0) = 223.000000
 Test output @ (0,0) = 223.000000

有人知道为什么会这样吗?

根据文件mat.data返回一个uchar*

要获得double值,您需要访问像素,如:

 double val = mat.at<double>(i,j);

或使用指针

 double* pdata = mat.ptr<double>(0);
 double val = pdata[i*mat.step+j];

或:

 double* prow = mat.ptr<double>(i);
 double val = prow(j);