gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:16:47 25 4
gpt4 key购买 nike

输入图像是具有CV_16UC1编码的深度图像(深度值以毫米为单位)。我想将深度值转换为米。稍后,我需要几个像素的深度值。因此,我正在使用mat.at()来访问各个像素位置。最后,将深度值乘以0.001f将其转换为米。
但是,我不希望在使用mat.at()函数之后乘以深度值,而是要以另一种方式做到这一点,即将整个图像乘以0.001f,然后使用mat.at()函数。不幸的是,这给了错误的值(value)。示例代码如下所示-

#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;
}
以下是输出-
depth_mm 123, depth_m 0.123, depth_unsigned_short 0, depth_float 9.18355e-41
我期望第二种方式看到0.123。但是我们看到 depth_unsigned_shortdepth_float都返回错误的值。

最佳答案

您应该使用opencv提供的矩阵转换实用程序。
检查convertTo
就像是:

cv::mat f32Mat;
img_mm.convertTo(f32Mat,CV_32FC1,0.001);
应该可以。
假设 img_m是一个浮点矩阵,至少以下代码声明是错误的。
float depth_unsigned_short = img_m.at<unsigned short>(pixel_y, pixel_x);

关于opencv - 在OpenCV中转换CV_16UC1类型的深度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64383958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com