在OpenCV中转换CV_16UC1类型的深度图像

在OpenCV中转换CV_16UC1类型的深度图像,opencv,Opencv,输入图像是具有CV_16UC1编码的深度图像(深度值以毫米为单位)。我想将深度值转换为米。稍后,我需要几个像素的深度值。因此,我使用mat.at()访问各个像素位置。最后,将深度值乘以0.001f,将其转换为米 但是,在使用mat.at()函数后,我想用另一种方法,即将整个图像乘以0.001f,然后使用mat.at()函数,而不是将深度值相乘。不幸的是,这给出了错误的值。下面显示了一个示例代码- #include <iostream> #include <opencv2/ope

输入图像是具有
CV_16UC1
编码的深度图像(深度值以毫米为单位)。我想将深度值转换为米。稍后,我需要几个像素的深度值。因此,我使用mat.at()访问各个像素位置。最后,将深度值乘以0.001f,将其转换为米

但是,在使用
mat.at()
函数后,我想用另一种方法,即将整个图像乘以0.001f,然后使用
mat.at()
函数,而不是将深度值相乘。不幸的是,这给出了错误的值。下面显示了一个示例代码-

#include <iostream>
#include <opencv2/opencv.hpp>

int main(int argc, char* argv[])
{
  cv::Mat img_mm(480, 640, CV_16UC1);

  // just for debugging
  randu(img_mm, cv::Scalar(0), cv::Scalar(1234));

  // assign a fixed value at (0, 0) just for debugging
  int pixel_x = 0;
  int pixel_y = 0;
  img_mm.at<unsigned short>(pixel_y, pixel_x) = 123;

  // the first way
  auto depth_mm = img_mm.at<unsigned short>(pixel_y, pixel_x);
  auto depth_m = depth_mm * 0.001f;

  // the second way
  cv::Mat img_m = img_mm * 0.001f;
  float depth_unsigned_short = img_m.at<unsigned short>(pixel_y, pixel_x);
  float depth_float = img_m.at<float>(pixel_y, pixel_x);

  std::cout << "depth_mm " << depth_mm << ", depth_m " << depth_m << ", depth_unsigned_short " << depth_unsigned_short << ", depth_float " << depth_float << std::endl;

  return 0;
}

我原以为第二条路会是0.123。但是我们发现
depth\u unsigned\u short
depth\u float
都返回了错误的值。

您应该使用opencv提供的矩阵转换实用程序。 检查

比如:

cv::mat f32Mat;
img_mm.convertTo(f32Mat,CV_32FC1,0.001);
我们应该做到这一点

假设
img\u m
是一个浮点矩阵,至少下面的代码语句是错误的

float depth_unsigned_short = img_m.at<unsigned short>(pixel_y, pixel_x);
float depth\u unsigned\u short=img\u m.at(像素y,像素x);

非常感谢。我知道如何运作。您能告诉我convertTo功能所需的输出图像类型吗?非常感谢。它就像一个符咒。我尝试过使用
CV_16FC1
,但似乎opencv2.4.8中没有
CV_16FC1
。因此,我正在按照您的建议使用
CV_32FC1
float depth_unsigned_short = img_m.at<unsigned short>(pixel_y, pixel_x);