将Depth Image转换为open cv Mat格式

时间:2016-07-13 13:17:33

标签: c++ opencv

我正在使用PMD相机以下列格式捕捉深度图像

struct DepthData
{
    int      version;  
    std::chrono::microseconds timeStamp;       
    uint16_t                  width;           
    uint16_t                  height;          
    Vector of uint_16          exposureTimes;   
    Vector of DepthPoint     points;          //!< array of points
};

深度点结构如下所示

struct DepthPoint
{
    float x;                 //!< X coordinate [meters]
    float y;                 //!< Y coordinate [meters]
    float z;                 //!< Z coordinate [meters]
    float noise;             //!< noise value [meters]
    uint16_t grayValue;      //!< 16-bit gray value
    uint8_t depthConfidence; //!< value 0 = bad, 255 = good
};

我正在尝试将其转换为opencv mat数据结构。下面是代码。 但这是一个例外。请帮助

const int imageSize = w * h;

Mat out = cv::Mat(h, w, CV_16UC3, Scalar(0, 0, 0));

const Scalar S;


for (int h = 0; h < out.rows; h++)
{
  //printf("%" PRIu64 "\n", point.at(h).grayValue);
  for (int w = 0; w < out.cols; w++)
  {
    //printf("%" PRIu64 "\n", point.at(h).grayValue);
    out.at<cv::Vec3f>(h,w)[0] = point[w].x;
    out.at<cv::Vec3f>(h, w)[1] = point[w].y;
    out.at<cv::Vec3f>(h, w)[2] = point[w].z;

  }
}

imwrite("E:/softwares/1.8.0.71/bin/depthImage1.png", out);

1 个答案:

答案 0 :(得分:0)

你似乎做错了几件事。

您正在创建类型为CV_16UC3的图像,这是一个3通道16位无符号字符图像。然后在out.at<cv::Vec3f>(h,w)[0]中,您尝试将其中的一部分作为3个浮点数的向量读取。您可能应该将图像创建为浮动图像。

有关详细信息,请提供例外情况。它会更容易帮助。

UPD:如果您只想要深度图片,请创建如下图像:

Mat out = cv::Mat::zeros(h, w, CV_16UC1);

然后在每个像素中:

out.at<uint16_t>(h, w) = depth_point.grayValue;