在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);