我使用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
有谁知道为什么会这样?
答案 0 :(得分:2)
根据doc
@AuthorizationRequired
会返回mat.data
。
要获取uchar*
值,您需要访问以下像素:
double
或使用指针:
double val = mat.at<double>(i,j);
或:
double* pdata = mat.ptr<double>(0);
double val = pdata[i*mat.step+j];