在 OpenCV 中将深度图像从毫米转换为米

Converting depth image from millimeter to meters in OpenCV

这看起来很简单,但我在处理 OpenCV 图像时遇到错误。输入图像是具有 CV_16UC1 编码的深度图像(深度值以毫米为单位)。我想将深度值转换为米,如下所示-

auto img_m = img_mm * 0.001f; // convert to meter (SI units)

最后,我需要几个像素的深度值。因此,我按以下方式使用 mat.at() 函数-

// let say we want to get the depth value at (0, 0)
int pixel_x = 0;
int pixel_y = 0;
auto depth = img_m.at<unsigned short>(pixel_y, pixel_x);

不幸的是,它显示了以下编译错误-

error: ‘class cv::MatExpr’ has no member named ‘at’
       auto depth = img_m.at<unsigned short>(pixel_y, pixel_x);

出于好奇,我查看了两张图片的数据类型,发现如下-

std::cout << "cvtype(img_mm): " << img_mm.type() << std::endl;
std::cout << "size(img_mm): " << img_mm.size() << " size(img_m): " << img_m.size() << std::endl;
std::cout << "type(img_mm): " << typeid(img_mm).name() << " type(img_m): " << typeid(img_m).name() << std::endl;

cvtype(img_mm): 2
size(img_mm): [640 x 480] size(img_m): [640 x 480]
type(img_mm): N2cv3MatE type(img_m): N2cv7MatExprE

这里,我们可以看到img_mN2cv7MatExprE,这是导致编译错误的原因。

作为解决方法,我没有将 img_mm 转换为 img_m,而是按如下方式乘以深度值 -

auto depth_mm = img_mm.at<unsigned short>(pixel_y, pixel_x);
auto depth_m = depth_mm * 0.001f; // convert to meter (SI units)

但是,我想知道为什么标量乘法变得疯狂!!!

以下是环境详情-

您正在使用 auto 让编译器推断出 img_m 的类型,并且编译器将其正确推断为 cv::MatExprcv::Mat 和标量相乘得到 cv::MatExpr,可以转换为 cv::Mat。为避免此问题,您应该为 img_m:

指定类型
cv::Mat img_m = img_mm * 0.001f; // convert to meter (SI units)