gpt4 book ai didi

c++ - 将特征矩阵转换为 unsigned char *

转载 作者:行者123 更新时间:2023-11-30 04:46:32 24 4
gpt4 key购买 nike

我正在尝试使用 Eigen 与 unsigned char * 类型进行交互。我可以转换为 Eigen,然后转换为 float,但是当我转换回 unsigned char 时,结果是错误的。我需要 Eigen 矩阵为 float 类型,以便我可以对其执行算术运算。然后我需要将它恢复为 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 打印出正确的 float 值,因此可能是向 unsigned char 的转换是错误的。

最佳答案

当你这样做时:

(float)*(gray_UC+1)

您正在获取指针 gray_UC 并根据 pointer arithmetic 向其加一.如果 unsigned char 是一个字节,则意味着 gray_UC 之后只有一个字节。然后取消引用它,将下一个字节作为 unsigned char,然后将该值转换为 float。我推测结果应该是一个介于 0 和 255 之间的 float 。

这里:

(float)*(data+1)

您将指针 data 加 1,但在本例中是指向 float 的指针,它是 4 个字节,会将指针向前移动四个字节.接下来,您取消引用它并将其转换为 float (无论如何都不应该有任何影响),这样您就可以在 data 指向的浮点缓冲区中获得第二个浮点值。

为了从 gray_UC 获得相同的内容,您需要执行以下操作:

*(((float*) gray_UC) + 1)

关于c++ - 将特征矩阵转换为 unsigned char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56690906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com