Kinect2.0深度图与彩色图对齐(C++)
前言
使用Kinect2.0的设备采集数据时深度图和彩色图怎么对齐是一个问题,在解决这一问题的过程中参考了很多方法,最终解决了这一问题,感谢以下两篇文章的作者给与了我解决问题的思路。
第一位: 我找不到他的博客地址了,但还是很感谢这位博主的无私奉献
第二位:https://zhuanlan.zhihu.com/p/33001167
运行环境
在运行本文代码前请注意以下几点:
- 首先需要保证机器有opencv编程环境
- 安装了Kinect for Windows SDK且Kinect设备能正常运行
代码介绍
在写这篇博客时,本着助人为乐的原则,在这里我加了代码介绍,对代码进行简单介绍,帮助有需要的人理解代码。
- 首先连接到Kinect设备
IKinectSensor* m_pKinectSensor;
HRESULT hr;
hr = GetDefaultKinectSensor(&m_pKinectSensor);
- 然后创建一个多帧数据读取器
IMultiSourceFrameReader* m_pMultiFrameReader;
读取的数据主要有彩色、深度以及红外数据,如果想采集指定的数据可以声明不同的读取器比如:
IDepthFrameReader;
IColorFrameReader;
IInfraredFrameReader;
- 生成指定尺寸的图像
Mat i_rgb(1080, 1920, CV_8UC4);
Mat i_depth(424, 512, CV_8UC1);
Mat i_ir(424, 512, CV_16UC1);
生成的图像如下所示:
彩色图

深度图

红外图

- 分别保存不同类型图像
imwrite("E:\\CCode\\Line_Segmentation\\File\\img\\" + to_string(img_num) + "_bgra.png", i_rgb);
imwrite("E:\\CCode\\Line_Segmentation\\File\\img\\" + to_string(img_num) + "_depth.png", i_depth);
imwrite("E:\\CCode\\Line_Segmentation\\File\\img\\" + to_string(img_num) + "_ir.png", i_ir);
- 生成和深度图对齐的彩色图
这里是本文的重点,关键函数就是
HRESULT STDMETHODCALLTYPE MapDepthFrameToColorSpace(
UINT depthPointCount,
const UINT16 *depthFrameData,
UINT colorPointCount,
ColorSpacePoint *colorSpacePoints);
第一个参数为深度帧里面点的个数,对Kinect2为 512x424
第二个参数为深度帧
第三个参数是输出彩色图的像素个数,也是512x424
第四个参数是二者的映射矩阵
- 根据映射矩阵生成与深度图对齐的彩色图
得到映射矩阵后可以根据对应的映射坐标生成彩色对齐图如下图所示:

到此代码主要模块基本介绍完了,下面会贴上全部代码,希望能帮到你。
实现代码
#include <iostream>
#include <kinect.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
//安全释放指针
template<class Interface>
inline void SafeRelease(Interface*& pInterfaceToRelease)
{
if (pInterfaceToRelease != NULL)
{
pInterfaceToRelease->Release();
pInterfaceToRelease = NULL;
}
}
int main()
{

本文介绍如何使用Kinect2.0设备采集数据并实现深度图与彩色图的对齐。通过获取Kinect设备的数据源,利用C++编程实现图像采集,并通过映射矩阵生成与深度图对齐的彩色图。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



