从原始缓冲区数据创建Mat图像

Mat Image creation from raw buffer data

本文关键字:Mat 图像 创建 数据 原始 缓冲区      更新时间:2023-10-16

我有一个图像的浮动x,浮动y,浮动z值。我想通过复制z值来构建一个16位的png深度图像。我得到的图像结果有一些无效点。下面是我的代码。

 uint16_t* depthValues = new uint16_t[size];
auto sampleVector(DepthPoints);
for (unsigned int i = 0; i < sampleVector.size(); i++)
    {
        depthValues[i] = (sampleVector.at(i).z) * 65536;
    }
  Mat newDepthImage = cv::Mat(var.height, var.width, CV_16UC1,depthValues);
imwrite(Location, CImage);

有人能告诉我,如果我可以复制浮点值到一个无符号字符数组来创建图像?这就是为什么我的图像有无效点吗?

auto sampleVector(DepthPoints);
const int size = sampleVector.size();
float* depthValues = new float[size];
for (unsigned int i = 0; i < sampleVector.size(); i++)
    {
      depthValues[i] = (sampleVector.at(i).z);
    }
Mat depthImageOne, depthImageTwo;
Mat depthImageNew = cv::Mat(var.height, var.width, CV_32FC1,depthValues);
normalize(newDepthImageNew, depthImageOne, 1, 0, NORM_MINMAX, CV_32FC1);
depthImageOne.convertTo(depthImageTwo, CV_16UC1, 65536.0,0.0);
imwrite("path", depthImageTwo);

规范化可能导致深度信息丢失。我使用了规范化来可视化图像。为了保存深度信息,我使用了下面的代码:

Mat depthImageNew = cv::Mat(var.height, var.width, CV_32FC1,depthValues);
depthImageOne.convertTo(depthImageTwo, CV_16UC1, 1000.0,0.0);