halcom中国吧 关注:11贴子:147
  • 1回复贴,共1

C++ float类型转化为Mat uint8

只看楼主收藏回复

#include <opencv2/opencv.hpp>
#include <vector>
int main() {
// 假设我们有一个float类型的vector,它包含我们想要转换的数据
std::vector<float> floatData = {10.0f, 20.0f, 30.0f, 255.0f, 0.0f, 127.5f};
// 创建一个与floatData相同大小的Mat对象,类型为CV_32F
cv::Mat floatMat(floatData.size(), 1, CV_32F);
// 将floatData的数据复制到floatMat中
memcpy(floatMat.data, floatData.data(), floatData.size() * sizeof(float));
// 创建一个用于存储转换结果的Mat对象,类型为CV_8U
cv::Mat uint8Mat;
// 将floatMat的数据范围缩放到0-255,并转换为uint8类型
floatMat.convertTo(uint8Mat, CV_8U, 255.0 / (floatMat.max() - floatMat.min()), -floatMat.min() * 255.0 / (floatMat.max() - floatMat.min()));
// 打印转换后的数据
std::cout << "Converted uint8 Mat:" << std::endl;
for (int i = 0; i < uint8Mat.rows; ++i) {
std::cout << (int)uint8Mat.at<uchar>(i, 0) << " ";
}
std::cout << std::endl;
return 0;
}


IP属地:广东1楼2024-03-31 08:21回复
    cv::Mat TensorToMat(const torch::Tensor& tensor) {
    // 检查张量是否是二维的
    TORCH_CHECK(tensor.dim() == 2, "Tensor must be 2-dimensional");
    // 获取张量的尺寸
    int height = tensor.size(0);
    int width = tensor.size(1);
    // 创建一个相同大小的cv::Mat对象,类型为uint8
    cv::Mat mat(height, width, CV_8U);
    // 确保张量的数据类型是uint8,或者进行必要的转换
    if (tensor.scalar_type() != torch::kUInt8) {
    // 如果不是uint8类型,则需要进行类型转换和缩放
    // 这里假设原始张量的数据类型可以线性地映射到[0, 255]范围内
    torch::Tensor scaled_tensor = tensor.clone(); // 避免修改原始张量
    scaled_tensor.mul_(255.0).clamp_(0, 255).to(torch::kUInt8); // 缩放并转换类型
    std::memcpy(mat.data, scaled_tensor.data_ptr<uchar>(), height * width * sizeof(uchar));
    } else {
    // 如果已经是uint8类型,则直接复制数据
    std::memcpy(mat.data, tensor.data_ptr<uchar>(), height * width * sizeof(uchar));
    }
    return mat;
    }


    IP属地:广东2楼2024-03-31 08:24
    回复