在 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_m
是N2cv7MatExprE
,这是导致编译错误的原因。
作为解决方法,我没有将 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)
但是,我想知道为什么标量乘法变得疯狂!!!
以下是环境详情-
- Ubuntu 14.04 LTS OS
- ROS Indigo(ROS 附带的默认 OpenCV)
- OpenCV 2.4.8
- CMAKE_CXX_COMPILER_VERSION 4.8.5
您正在使用 auto
让编译器推断出 img_m
的类型,并且编译器将其正确推断为 cv::MatExpr
。 cv::Mat
和标量相乘得到 cv::MatExpr
,可以转换为 cv::Mat
。为避免此问题,您应该为 img_m
:
指定类型
cv::Mat img_m = img_mm * 0.001f; // convert to meter (SI units)
这看起来很简单,但我在处理 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_m
是N2cv7MatExprE
,这是导致编译错误的原因。
作为解决方法,我没有将 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)
但是,我想知道为什么标量乘法变得疯狂!!!
以下是环境详情-
- Ubuntu 14.04 LTS OS
- ROS Indigo(ROS 附带的默认 OpenCV)
- OpenCV 2.4.8
- CMAKE_CXX_COMPILER_VERSION 4.8.5
您正在使用 auto
让编译器推断出 img_m
的类型,并且编译器将其正确推断为 cv::MatExpr
。 cv::Mat
和标量相乘得到 cv::MatExpr
,可以转换为 cv::Mat
。为避免此问题,您应该为 img_m
:
cv::Mat img_m = img_mm * 0.001f; // convert to meter (SI units)