我正在使用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);
答案 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;