Android ndk传递OpenCV mat到jni包含双值
Android ndk pass OpenCV mat to jni containing double values
我使用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);
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- 如何将包含指数的 QString 转换为C++中的双倍?
- C++将包含非人类可读数据的字符串转换为 200 双精度
- 查看数字是否包含在未排序的双数字间隔内的最有效方法?
- 如何使用 c++ 将多个变量存储在一个变量中?例如,双精度 x,y,z 包含在可变点 p 中
- 如何将 gnu-libstdc++ 包含在 JNI Java swing 项目中
- 通过更改代码格式来计算结构向量中包含的双精度变量的平均值的不同结果?
- 包含双指针的单链表的正确名称是什么
- 在 c++ 中将字符串(包含字符和浮点数)转换为双精度
- 如何使用 scanf 从用户输入中获取字符串 ( char * ),由双引号分隔并包含空格
- 地图和unordered_map包含指向双精度的指针
- 比较两个包含双精度的文件
- C++中包含双标题
- 如何通过 JNI 设置 java 类的双精度/整数类型的值
- 如何在c++中对包含双值的字符串强制执行精度
- 为什么双空大括号 { { } } 创建一个<double>包含一个元素而不是零元素的 std::initializer_list?
- C++将包含对象的向量转换为包含双精度的向量
- 如何将包含双精度的std::string转换为双精度的vector ?
- Android ndk传递OpenCV mat到jni包含双值
- c++中对包含双精度类型数字的数组进行排序的最快方法是什么?