本文采用高博大佬的代码来跑kinect v1获取的彩色图和深度图。

首先是获取彩色图和深度图的代码:

#include <windows.h>
#include <iostream>
#include <NuiApi.h>
#include <opencv2/opencv.hpp>
#include<string.h>using namespace std;
using namespace cv;void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage);
void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage);int i = 0;
string rgb = "./rgb/";
string title = ".png";
string depth = "./depth/";
int main(int argc, char *argv[])
{Mat colorImage;colorImage.create(480, 640, CV_8UC3);Mat depthImage;depthImage.create(480, 640, CV_8UC1);HANDLE colorEvent = CreateEvent(NULL, TRUE, FALSE, NULL);HANDLE depthEvent = CreateEvent(NULL, TRUE, FALSE, NULL);HANDLE colorStreamHandle = NULL;HANDLE depthStreamHandle = NULL;HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH);if (hr != S_OK){cout << "NuiInitialize failed" << endl;return hr;}hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NULL, 4, colorEvent, &colorStreamHandle);if (hr != S_OK){cout << "Open the color Stream failed" << endl;NuiShutdown();return hr;}hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, NULL, 2, depthEvent, &depthStreamHandle);if (hr != S_OK){cout << "Open the depth Stream failed" << endl;NuiShutdown();return hr;}namedWindow("colorImage", CV_WINDOW_AUTOSIZE);namedWindow("depthImage", CV_WINDOW_AUTOSIZE);while (1){if (WaitForSingleObject(colorEvent, 0) == 0)getColorImage(colorEvent, colorStreamHandle, colorImage);if (WaitForSingleObject(depthEvent, 0) == 0)getDepthImage(depthEvent, depthStreamHandle, depthImage);imshow("colorImage", colorImage);imshow("depthImage", depthImage);imwrite(rgb + to_string(i) + title, colorImage);imwrite( depth + to_string(i) + title, depthImage);i++;if (cvWaitKey(1) == 27)break;}NuiShutdown();return 0;
}void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage)
{const NUI_IMAGE_FRAME *colorFrame = NULL;NuiImageStreamGetNextFrame(colorStreamHandle, 0, &colorFrame);INuiFrameTexture *pTexture = colorFrame->pFrameTexture;NUI_LOCKED_RECT LockedRect;pTexture->LockRect(0, &LockedRect, NULL, 0);if (LockedRect.Pitch != 0){for (int i = 0; i<colorImage.rows; i++){uchar *ptr = colorImage.ptr<uchar>(i);  //第i行的指针                    //每个字节代表一个颜色信息,直接使用ucharuchar *pBuffer = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;for (int j = 0; j<colorImage.cols; j++){ptr[3 * j] = pBuffer[4 * j];  //内部数据是4个字节,0-1-2是BGR,第4个现在未使用 ptr[3 * j + 1] = pBuffer[4 * j + 1];ptr[3 * j + 2] = pBuffer[4 * j + 2];}}}else{cout << "捕捉色彩图像出现错误" << endl;}pTexture->UnlockRect(0);NuiImageStreamReleaseFrame(colorStreamHandle, colorFrame);
}void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage)
{const NUI_IMAGE_FRAME *depthFrame = NULL;NuiImageStreamGetNextFrame(depthStreamHandle, 0, &depthFrame);INuiFrameTexture *pTexture = depthFrame->pFrameTexture;NUI_LOCKED_RECT LockedRect;pTexture->LockRect(0, &LockedRect, NULL, 0);RGBQUAD q;if (LockedRect.Pitch != 0){//4.5、将数据转换为OpenCV的Mat格式for (int i = 0; i < depthImage.rows; i++){uchar *ptr = depthImage.ptr<uchar>(i);  //第i行的指针//深度图像数据含有两种格式,这里像素的低12位表示一个深度值,高4位未使用;//注意这里需要转换,因为每个数据是2个字节,存储的同上面的颜色信息不一样,uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;USHORT * pBuffer = (USHORT*)pBufferRun;for (int j = 0; j < depthImage.cols; j++){ptr[j] = 255 - (uchar)(256 * pBuffer[j] / 0x0fff);  //直接将数据归一化处理}}}else{cout << "捕捉深度图像出现错误" << endl;}pTexture->UnlockRect(0);NuiImageStreamReleaseFrame(depthStreamHandle, depthFrame);
}

彩色图示例:

深度图示例:

RGBD-SLAM运行结果:

采用pcl_viewer查看生成的result.pcd

效果不怎么好,还是要继续提高姿势水平啊。

最后再次感谢高博大佬,RGB-D SLAM代码可参考我的GitHub。

RGBD-SLAM实战相关推荐

  1. 从零手写RGBD SLAM

    刚学习完ORB-SLAM2框架,但苦于没有实战项目,总感觉心里没底.偶然间发现了高翔博士的一起做RGBD SLAM博客,简单看了一点就感觉对自己大有帮助,hh大佬就是大佬,完全理解我们这群小菜鸡的现状 ...

  2. BAD SLAM:捆绑束调整直接RGB-D SLAM

    BAD SLAM:捆绑束调整直接RGB-D SLAM BAD SLAM: Bundle Adjusted Direct RGB-D SLAM 论文地址: http://openaccess.thecv ...

  3. Towards Real-time Semantic RGB-D SLAM in Dynamic Environments(动态语义SLAM)

    动态环境下的实时语义SLAM 简介 摘要 系统流程 实验结果 总结 简介 在ICRA 2021上看到这样一篇论文:Towards Real-time Semantic RGB-D SLAM in Dy ...

  4. 结构化场景中的RGB-D SLAM

    点云PCL免费知识星球,点云论文速读. 文章:RGB-D SLAM with Structural Regularities 作者:Yanyan Li , Raza Yunus , Nikolas B ...

  5. 面向动态环境基于面元的RGB-D SLAM系统

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L https://zhuanlan.zhihu.com/p/142175916 本 ...

  6. Improving RGB-D SLAM in dynamic environments: A motion removal approach

    一.贡献 (1)提出一种针对RGB-D的新的运动分割算法 (2)运动分割采用矢量量化深度图像 (3)数据集测试,并建立RGB-D SLAM系统 二.Related work [1]R.K. Namde ...

  7. 3D Mapping with an RGB-D Camera(RGBD SLAM V2 )论文笔记

    这篇文章即是Felix Endres等人12年完成的RGB-D SLAM V2,是最早的为kinect风格传感器设计的SLAM系统之一 没看到有相关的论文解析 在Github上可找到开源代码,工程配置 ...

  8. 论文笔记_S2D.77_2013_TOR_使用RGBD相机的3D建图(RGBD SLAM V2)

    目录 基本情况 摘要 介绍 系统流程 特征提取 运动估计 EMM:Environment Measurement Model 回环检测 图优化 建图OctoMap 参考 基本情况 出处:Endres ...

  9. 一起做RGB-D SLAM(3)

    第三讲 特征提取与配准 师兄:同学们大家好,又到我们每周一次的"一起做RGB-D SLAM"时间啦!大家还记得上周我们讲了什么东西吗? 小萝卜:等一下师兄!我们的博客什么时候变成每 ...

  10. 调试笔记——《一起做RGB-D SLAM 》

    花了前后大概两周的时间,好好整理了一遍高博的<一起做RGB-D SLAM >系列,调试过程中发现,在安装g2o这个包时遇到了很多问题,下面把解决问题的过程记录一下. 起初安装g2o这个包时 ...

最新文章

  1. 让文本垂直居中的几个方法
  2. jquery mobile实例
  3. 记阿里的一次壮烈牺牲
  4. Spring框架分为哪七大模块以及各模块的主要功能作用
  5. 计算机所有数据的表示方式都是用,计算机数据表示
  6. python训练手势分类器_机器学习零基础?手把手教你用TensorFlow搭建图像分类器|干货...
  7. Java 平台有哪几个版本?
  8. Java ObjectInputStream readFloat()方法与示例
  9. linux tcp 阻塞时间,TCP的阻塞和重传机制
  10. vue.js2.0 java_详解vite2.0配置学习(typescript版本)
  11. 问题-Fastreport4 Memo打印时中文显示不全
  12. Android进阶——Android无障碍服务之AccessibilityService实现微信抢红包插件
  13. 三菱PLC 定时器
  14. java 打印对象_java中直接打印对象
  15. FineReport中cjk编码转换
  16. deepin设置快捷键
  17. python 处理英文步骤
  18. 苏超 计算机系 南京大学,Ni-Ti基合金薄膜相变行为及其力学特性研究
  19. ARVR | AR技术发展简史(下)
  20. ArcGIS教程:要素类基础知识(一)

热门文章

  1. DIF,DEA及MACD——C++函数式元编程实现
  2. android中的C2DM
  3. Ubuntu下文件夹内文件排序问题
  4. 我爱上了我的司机 (5)
  5. android开机自启广播无效果的曲线解决方案
  6. 红外遥控按键16进制编码
  7. Pixhawk无人机-ArduPilot 软件SITL仿真模拟飞行(SITL+MAVProxy)
  8. 移动APP功能测试要点总结
  9. 哪些 Python 库让你相见恨晚?【转】
  10. 简单直白教你理解Java中四大引用强引用,软引用,弱引用,虚引用