使用opencv将16位深度图转灰度图

使用opencv将16位深度图转灰度图,默认深度图每个像素以uint16_t来保存。

#include <string>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

void depth_img_save(uint16_t* raw_data)
{
    int rows = 480; 
    int cols = 640; 
    Mat depth_img = Mat(rows,cols,CV_8UC1);
    int max_depth = 10000; //默认最大测距为10000mm 
    for (int i = 0; i < rows; i++)  //480 默认先行后列保存
     {
        for (int j = 0; j < cols; j++)  //640
        {
        	//每个距离归一化后*255,即映射到0-255范围
            uchar pixel = raw_data[i*cols+j]*255/max_depth;
            depth_img.at<uchar>(i,j) = pixel;
        }
    }
    imshow("depth_img",depth_img);
    imwrite("depth_img.jpg",depth_img);
    waitKey();
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
OpenCV (Open Source Computer Vision Library) 提供了丰富的功能,包括处理各种深度图像是其一。对于16深度图片,OpenCV通常指的是高动态范围(High Dynamic Range, HDR)图像,每个像素点有16的精度,能够存储更多的灰度值细节,常用于医学图像分析、工业视觉等领域。 要在OpenCV中显示16深度图像,你需要采取以下步骤: 1. **读取图像**:使用`cv::imread`函数,并指定`IMREAD_ANYDEPTH | IMREAD_IGNORE_ORIENTATION`标志,以便正确读取16深度图像。 ```cpp cv::Mat depth_img = cv::imread("path_to_your_image", cv::IMREAD_ANYDEPTH | cv::IMREAD_IGNORE_ORIENTATION); ``` 2. **换成合适格式**:由于OpenCV的一些显示函数默认处理8图像,所以可能需要先将16图像换为8或32图像,可以使用`cvtColor`函数。 ```cpp cv::Mat color_img; if (depth_img.depth() == CV_16U) { cv::Mat temp; cv::convertScaleAbs(depth_img, temp, 1.0 / 256.0); // 对比度调整 cv::applyColorMap(temp, color_img, cv::COLORMAP_JET); // 或者选择其他调色板 } else if (depth_img.depth() == CV_32F) { // 如果是浮点类型,可能需要进一步处理再换 // 示例:color_img = cv::Mat(depth_img.rows, depth_img.cols, CV_8UC3, cv::Scalar(0, 0, 0)); } ``` 3. **显示图像**:最后使用`imshow`函数显示处理后的图像。 ```cpp cv::imshow("Depth Image", color_img); cv::waitKey(); ``` 注意:16图像通常不会直接在窗口中显示,因为大部分显示器无法直接支持。上述代码示例仅供参考,实际应用可能需要根据你的需求进行调整。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值