Kinect 获取深度图计算距离,并进行彩色图和深度图之间的映射

2023-05-16

Kinect 获取深度图计算距离,并进行彩色图和深度图之间的映射

最近所进行的项目需要利用KINECT获取深度距离,需要得到彩色图中某一点的位置,在网上找了很多资料,都不是很好,碰了很多坑,这里我整理了一下发给大家,大家有需求可以自取。


获取深度图计算距离

KINECT安装openCv安装这里就不说了呢,网上一大堆。
直接上代码:

注意这里是初始化的一些代码,有些头文件是之后做通信用的,不需要的话可以删掉呢,比如Winsock2 wstcpip等

初始化的一些操作这里就不说了

下面是循环读取最近的一帧:

    while (1) {
        // Color Frame
        IColorFrame* pColorFrame = nullptr;
        hResult = pColorReader->AcquireLatestFrame(&pColorFrame);
        if (SUCCEEDED(hResult)) {
            hResult = pColorFrame->CopyConvertedFrameDataToArray(colorBufferSize, reinterpret_cast<BYTE*>(colorBufferMat.data), ColorImageFormat::ColorImageFormat_Bgra);
            if (SUCCEEDED(hResult)) {
            //  cv::resize(colorBufferMat, colorMat, cv::Size(), 0.5, 0.5);
            }
        }
        //SafeRelease( pColorFrame );

        // Depth Frame
        IDepthFrame* pDepthFrame = nullptr;
        hResult = pDepthReader->AcquireLatestFrame(&pDepthFrame);
        if (SUCCEEDED(hResult)) {
            hResult = pDepthFrame->AccessUnderlyingBuffer(&depthBufferSize, reinterpret_cast<UINT16**>(&depthBufferMat.data));
            pDepthFrame->CopyFrameDataToArray(depthHeight * depthWidth, (UINT16 *)temp.data); //先把数据存入16位的图像矩阵中
            if (SUCCEEDED(hResult)) {
                depthBufferMat.convertTo(depthMat, CV_8U, -255.0f / 8000.0f, 255.0f);
            }
        }
        //SafeRelease( pDepthFrame );

        // Mapping (Depth to Color)
        if (SUCCEEDED(hResult)) {
            std::vector<ColorSpacePoint> colorSpacePoints(depthWidth * depthHeight);
            hResult = pCoordinateMapper->MapDepthFrameToColorSpace(depthWidth * depthHeight, reinterpret_cast<UINT16*>(depthBufferMat.data), depthWidth * depthHeight, &colorSpacePoints[0]);
            if (SUCCEEDED(hResult)) {
                coordinateMapperMat = cv::Scalar(0, 0, 0, 0);
                for (int y = 0; y < depthHeight; y++) {
                    for (int x = 0; x < depthWidth; x++) {
                        unsigned int index = y * depthWidth + x;
                        ColorSpacePoint point = colorSpacePoints[index];
                        int colorX = static_cast<int>(std::floor(point.X + 0.5));
                        int colorY = static_cast<int>(std::floor(point.Y + 0.5));
                        unsigned short depth = depthBufferMat.at<unsigned short>(y, x);
                        if ((colorX >= 0) && (colorX < colorWidth) && (colorY >= 0) && (colorY < colorHeight)/* && ( depth >= minDepth ) && ( depth <= maxDepth )*/) {
                            coordinateMapperMat.at<cv::Vec4b>(y, x) = colorBufferMat.at<cv::Vec4b>(colorY, colorX);
                        }

                    }
                }
            }
        }
        //反转图像

        cv::flip(coordinateMapperMat, coordinateMapperMatFlip, 1);
        cv::flip(temp, tempFlip, 1);

        std::string Img_Name = "D:\\git_project\\yolo\\darknetpro\\darknet\\build\\darknet\\x64\\testpic\\test_" + std::to_string(k) + ".jpg";
        std::string txt_addr = "D:\\git_project\\yolo\\darknetpro\\darknet\\build\\darknet\\x64\\picpath\\test_" + std::to_string(k) + ".txt";
        std::string buff = "testpic/test_" + std::to_string(k) + ".jpg";

        // 这里是得到深度图中的距离,一定要注意这里XY是反的, 例如你在映射后的图像中取到(1,2),在这里应该输入
        //(2,1)才能得到对应的深度, 切记
        std::cout << "1:  " << tempFlip.at<UINT16>(183, 237) << "\t";
        std::cout << "2:  " << tempFlip.at<UINT16>(187, 227) << "\t";
        std::cout << "3:  " << tempFlip.at<UINT16>(194, 230) << "\t";
        std::cout << "4:  " << tempFlip.at<UINT16>(250, 334) << "\t";
        std::cout << "5:  " << tempFlip.at<UINT16>(254, 326) << "\t";
        std::cout << "6:  " << tempFlip.at<UINT16>(259, 335) << "\n";


        temp.convertTo(img, CV_8UC1, 255.0 / 4500);   //再把16位转换为8位
        //cv::imwrite("D:\\Projects-2018\\Robotic_Sorting_7_13\\Kinect\\TestKinect\\DepthImage\\test_1.jpg", coordinateMapperMat);
        Sleep(1000);
        SafeRelease(pColorFrame);
        SafeRelease(pDepthFrame);

        //cv::imshow("Color", colorMat);
        //cv::imshow("Depth", depthMat);
        //cv::imshow("CoordinateMapper", coordinateMapperMat);

        /*cv::imshow("CoordinateMapper", coordinateMapperMatFlip);
        if (cv::waitKey(30) == VK_ESCAPE) {
            break;
        }*/
        k++;
    }

    SafeRelease(pColorSource);
    SafeRelease(pDepthSource);
    SafeRelease(pColorReader);
    SafeRelease(pDepthReader);
    SafeRelease(pColorDescription);
    SafeRelease(pDepthDescription);
    SafeRelease(pCoordinateMapper);
    if (pSensor) {
        pSensor->Close();
    }
    SafeRelease(pSensor);
    cv::destroyAllWindows();

    return 0;
}

coordinateMapperMat 是映射之后的图像如下:

这里写图片描述

注意这里利用OpenCv对图像进行了反转 Cv::flip,很大的坑,没有反转后的图像做坐标转换会有大问题。

并且取深度距离的时候切记:

这里是得到深度图中的距离,一定要注意这里XY是反的, 例如你在映射后的图像中取到(1,2),在这里应该输入(2,1)才能得到对应的深度, 切记

得到深度如下:

这里写图片描述

还有之前的文章写要去掉后三位是不需要的呢,现在的版本自动给我们转换了呢。

对应的所有源码包括YOLO端识别物体都放在我的Chat上了,有需求可以自取,Chat上还会更详细讲,这里比较忙,就不多说了。

https://gitbook.cn/gitchat/activity/5b8605f23b698170ceac1fc9

在Chat上有微信号,也可以直接加我问的,我如果有空的话会详细告诉你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kinect 获取深度图计算距离,并进行彩色图和深度图之间的映射 的相关文章

随机推荐

  • 消息队列OSQCreate失败:Assertion "OSQCreate" failed at line 71 in ..\LWIP\arch\sys_arch.c错误解决方法

    在STM32F407的上移植正点原子例程中的ucosII和LWIP功能时 xff0c 发现其他任务中创建其他消息邮箱后 xff0c 出现了如下的错误 xff1a Assertion OSQCreate failed at line 67 i
  • 学习Linux 编程的几本好书

    这次涉及到了具体的平台 GNU Linux Linux下开发与明显不同于Windows平台的特点 xff0c 从开发工具到项目组织 xff0c 都有较大的差距 首先声明 xff0c 在做Linux平台开发之前 xff0c 首先要熟练使用Li
  • http parser库的使用方法

    include 34 http parser h 34 include lt stdio h gt include lt stdlib h gt include lt string h gt include lt assert h gt i
  • PIXhawk4飞控学习笔记(一)开发环境

    PIXhawk4飞控学习笔记 xff08 一 xff09 开发环境 PIX4简介开发环境准备PIX4控制板MDK Keil5STM32CUBEMAXQGroundControl地面站 总结 PIX4简介 PX4是Dronecode平台的一部
  • Git常用命令

    1 Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址 这是非常重要的 xff0c 因为每次Git提交都会使用该用户信息 在Git 命令行中执行下面命令 xff1a 设置用户信息 git config global
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • 存储卡插上电脑时显示文件名变乱码请问怎样才能修复???

    存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编今天碰到的一个 xff0c 打开分区提示文件名变乱码 xff01 存储卡插上电脑时显示文件名变乱码请问怎样才能修复 存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编
  • putty使用python模块tkinter显示对话框出现_tkinter.TclError: no display name and no $DISPLAY environment variable

    问题描述 xff1a putty不能显示对话框 出现错误提示 xff1a tkinter TclError no display name and no DISPLAY environment variable 解决办法 xff1a 下载安
  • 有关于ValueError: Variable rnn/basic_lstm_cell/kernel already exists, disallowed.的问题

    很简单 xff0c 重新跑一篇程序 xff0c 我理解为重启核 xff1f xff1f xff1f jupyter中有kernel选项 xff0c 点击选择 Restart amp RunAll xff0c 即可解决问题 Mark
  • 从尾到头打印链表

    题目描述 xff1a 输入一个链表 xff0c 按链表值从尾到头的顺序返回一个ArrayList 分析 xff1a 1 xff0c 新建两个arraylist xff0c 2 xff0c 遍历链表 xff0c 存入第一个arraylist
  • Win10的Linux子系统Ubuntu安装图形界面

    Win10 的 Linux 子系统 Ubuntu 安装图形界面 陈拓 2021 07 25 2021 07 26 1 概述 Win10的linux子系统Windows Subsystem for Linux xff08 简称 WSL xff
  • 得到斐波那契数列的第n个数

    题目 xff1a 现在要求输入一个整数n xff0c 请你输出斐波那契数列的第n项 xff08 从0开始 xff0c 第0项为0 xff09 n lt 61 39 分析 xff1a 1 xff0c 1 xff0c 2 xff0c 3 xff
  • ModuleNotFoundError: No module named 'scipy._lib.decorator'问题解决

    问题来源 xff1a 在导入sklearn库时 xff0c 出现 usr lib python3 dist packages scipy sparse linalg isolve iterative py in 8 9 from scipy
  • 二叉搜索树的后序遍历序列

    题目 输入一个整数数组 xff0c 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则输出Yes 否则输出No 假设输入的数组的任意两个数字都互不相同 分析 碰到二叉树 xff0c 优先想递归 这里 xff0c 后序数组 xff0c 最
  • 二叉树中和为某一值的路径

    题目 输入一颗二叉树的跟节点和一个整数 xff0c 打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 注意 在返回值的list中 xff0c 数组长度大的数组靠前 分析 二叉树
  • 复杂链表的复制(java)

    题目 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针指向任意一个节点 xff09 xff0c 返回结果为复制后复杂链表的head xff08 注意 xf
  • CMake学习-添加头文件路径,库路径,库

    CMake中 xff0c 添加头文件路径 xff0c 对应的函数叫include directories 然后在参数中 xff0c 把所有需要添加的路径 xff0c 加进去就可以了 添加库路径 xff0c 对应的函数叫LINK DIRECT
  • Docker Run 命令

    docker run 参数 xff1a e xff1a 向容器内传递环境变量 xff0c 启动容器时用户可以动态传参 v 挂载文件 xff0c 把该容器的数据保存到挂载文件上 p 端口映射 xff08 p 8888 3306 8888宿主机
  • 如何复现论文?什么是论文复现?

    参考资料 xff1a 学习篇 顶会Paper复现方法 知乎 如何读论文 xff1f 复现代码 xff1f 复现代码是什么意思 CSDN 我是如何复现我人生的第一篇论文的 知乎 在我看来 xff0c 论文复现应该有一个大前提和分为两个层次 大
  • Kinect 获取深度图计算距离,并进行彩色图和深度图之间的映射

    Kinect 获取深度图计算距离 xff0c 并进行彩色图和深度图之间的映射 最近所进行的项目需要利用KINECT获取深度距离 xff0c 需要得到彩色图中某一点的位置 xff0c 在网上找了很多资料 xff0c 都不是很好 xff0c 碰