【发布时间】:2019-06-20 17:13:43
【问题描述】:
我正在尝试使用 Eigen 与 unsigned char * 类型进行交互。我可以转换为 Eigen,然后再转换为浮点数,但是当我转换回 unsigned char 时,结果是错误的。 我需要 Eigen 矩阵为浮点类型,以便可以对其执行算术运算。然后我需要把它带回 unsigned char 以便我可以保存它。
#include <Eigen/Dense>
#include <iostream>
int main(){
unsigned char* data;
for (int i=0;i<9;++i){
data[i]= i;
}
//Map data to Eigen
Map<Matrix<unsigned char,3,3> ,RowMajor> img(data,3,3);
//Convert to float
MatrixXf gray = img.cast<float>();
//Convert back to unsigned char*
float *gray_array = gray.data();
unsigned char *gray_UC = (unsigned char*)gray_array;
std::cout<<"Eigen matrix converted to unsigned char:"<<(float)*(gray_UC+1)<<std::endl;
std::cout<<"Eigen matrix as float: "<<*(gray_array+i)<<std::endl;
std::cout<<"Original data converted to float: "<<(float)*(data+1)<<std::endl;
}
数据是 unsigned char* 类型。
我希望 gray_UC 和 data 相同,但事实并非如此。更重要的是,gray_array 打印了正确的浮点值,所以可能是转换为 unsigned char 是错误的。
【问题讨论】:
-
我无法复制并粘贴提供的代码并对其进行编译。它不是独立的。 minimal reproducible example 在这里会很有帮助。问题可能是指针别名。提供的演员阵容相当可疑。
-
强制转换数组不会强制转换条目。见this question。或者干脆使用 Eigen 的
cast方法返回。但您可能希望自定义转换包含舍入。