Kinect2.0点云数据获取

接上一篇:Kinect2.0获取数据

http://blog.csdn.net/jiaojialulu/article/details/53087988

博主好细心,代码基本上帖过来就可以用,注释掉的部分改成文件输出就可以了!

#include "stdafx.h"
#include "kinect.h"
#include <iostream>
#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 _tmain(int argc, _TCHAR* argv[])
{
	// 获取Kinect设备
	IKinectSensor* m_pKinectSensor;
	HRESULT hr;
	hr = GetDefaultKinectSensor(&m_pKinectSensor);
	if (FAILED(hr))
	{
		return hr;
	}

	IMultiSourceFrameReader* m_pMultiFrameReader=NULL;
	if (m_pKinectSensor)
	{
		hr = m_pKinectSensor->Open();
		if (SUCCEEDED(hr))
		{
			// 获取多数据源到读取器  
			hr = m_pKinectSensor->OpenMultiSourceFrameReader(
				FrameSourceTypes::FrameSourceTypes_Color |
				FrameSourceTypes::FrameSourceTypes_Infrared |
				FrameSourceTypes::FrameSourceTypes_Depth,
				&m_pMultiFrameReader);
		}
	}

	if (!m_pKinectSensor || FAILED(hr))
	{
		return E_FAIL;
	}
	// 三个数据帧及引用
	IDepthFrameReference* m_pDepthFrameReference = NULL;
	IColorFrameReference* m_pColorFrameReference = NULL;
	IInfraredFrameReference* m_pInfraredFrameReference = NULL;
	IInfraredFrame* m_pInfraredFrame = NULL;
	IDepthFrame* m_pDepthFrame = NULL;
	IColorFrame* m_pColorFrame = NULL;
	// 三个图片格式
	Mat i_rgb(1080, 1920, CV_8UC4);      //注意:这里必须为4通道的图,Kinect的数据只能以Bgra格式传出
	Mat i_depth(424, 512, CV_8UC1);
	Mat i_ir(424, 512, CV_16UC1);

	UINT16 *depthData = new UINT16[424 * 512];
	IMultiSourceFrame* m_pMultiFrame = nullptr;
	while (true)
	{
		// 获取新的一个多源数据帧
		hr = m_pMultiFrameReader->AcquireLatestFrame(&m_pMultiFrame);
		if (FAILED(hr) || !m_pMultiFrame)
		{
			//cout << "!!!" << endl;
			continue;
		}

		// 从多源数据帧中分离出彩色数据,深度数据和红外数据
		if (SUCCEEDED(hr))
			hr = m_pMultiFrame->get_ColorFrameReference(&m_pColorFrameReference);
		if (SUCCEEDED(hr))
			hr = m_pColorFrameReference->AcquireFrame(&m_pColorFrame);
		if (SUCCEEDED(hr))
			hr = m_pMultiFrame->get_DepthFrameReference(&m_pDepthFrameReference);
		if (SUCCEEDED(hr))
			hr = m_pDepthFrameReference->AcquireFrame(&m_pDepthFrame);
		if (SUCCEEDED(hr))
			hr = m_pMultiFrame->get_InfraredFrameReference(&m_pInfraredFrameReference);
		if (SUCCEEDED(hr))
			hr = m_pInfraredFrameReference->AcquireFrame(&m_pInfraredFrame);

		// color拷贝到图片中
		UINT nColorBufferSize = 1920 * 1080 * 4;
		if (SUCCEEDED(hr))
			hr = m_pColorFrame->CopyConvertedFrameDataToArray(nColorBufferSize, reinterpret_cast<BYTE*>(i_rgb.data), ColorImageFormat::ColorImageFormat_Bgra);

		// depth拷贝到图片中
		if (SUCCEEDED(hr))
		{
			hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, depthData);
			for (int i = 0; i < 512 * 424; i++)
			{
				// 0-255深度图,为了显示明显,只取深度数据的低8位
				BYTE intensity = static_cast<BYTE>(depthData[i] % 256);
				reinterpret_cast<BYTE*>(i_depth.data)[i] = intensity;
			}
			ICoordinateMapper*      m_pCoordinateMapper=NULL;
			hr = m_pKinectSensor->get_CoordinateMapper(&m_pCoordinateMapper);
			ColorSpacePoint* m_pColorCoordinates = new ColorSpacePoint[512 * 424];
			HRESULT hr = m_pCoordinateMapper->MapDepthFrameToColorSpace(512 * 424, depthData, 512 * 424, m_pColorCoordinates);
		
			Mat i_depthToRgb(424, 512, CV_8UC4);
			if (SUCCEEDED(hr))
			{
				for (int i = 0; i < 424 * 512; i++)
				{
					ColorSpacePoint p = m_pColorCoordinates[i];
					if (p.X != -std::numeric_limits<float>::infinity() && p.Y != -std::numeric_limits<float>::infinity())
					{
						int colorX = static_cast<int>(p.X + 0.5f);
						int colorY = static_cast<int>(p.Y + 0.5f);

						if ((colorX >= 0 && colorX < 1920) && (colorY >= 0 && colorY < 1080))
						{
							i_depthToRgb.data[i * 4] = i_rgb.data[(colorY * 1920 + colorX) * 4];
							i_depthToRgb.data[i * 4 + 1] = i_rgb.data[(colorY * 1920 + colorX) * 4 + 1];
							i_depthToRgb.data[i * 4 + 2] = i_rgb.data[(colorY * 1920 + colorX) * 4 + 2];
							i_depthToRgb.data[i * 4 + 3] = i_rgb.data[(colorY * 1920 + colorX) * 4 + 3];
						}
					}
				}
			}
			imshow("rgb2depth", i_depthToRgb);
			if (waitKey(1) == VK_ESCAPE)
				break;
			CameraSpacePoint* m_pCameraCoordinates = new CameraSpacePoint[512 * 424];
			if (SUCCEEDED(hr))
			{
				HRESULT hr = m_pCoordinateMapper->MapDepthFrameToCameraSpace(512 * 424, depthData, 512 * 424, m_pCameraCoordinates);
			}
			if (SUCCEEDED(hr))
			{
				for (int i = 0; i < 512 * 424; i++)
				{
					CameraSpacePoint p = m_pCameraCoordinates[i];
					if (p.X != -std::numeric_limits<float>::infinity() && p.Y != -std::numeric_limits<float>::infinity() && p.Z != -std::numeric_limits<float>::infinity())
					{
						float cameraX = static_cast<float>(p.X);
						float cameraY = static_cast<float>(p.Y);
						float cameraZ = static_cast<float>(p.Z);

						//cout << "x: " << cameraX << "y: " << cameraY << "z: " << cameraZ << endl;
						//GLubyte *rgb = new GLubyte();
						//rgb[2] = i_depthToRgb.data[i * 4 + 0];
						//rgb[1] = i_depthToRgb.data[i * 4 + 1];
						//rgb[0] = i_depthToRgb.data[i * 4 + 2];
						 显示点
						//glColor3ubv(rgb);
						//glVertex3f(cameraX, -cameraY, cameraZ);
					}
				}
			}
			
		}


		// 显示
		/*imshow("rgb", i_rgb);
		if (waitKey(1) == VK_ESCAPE)
			break;*/
		imshow("depth", i_depth);
		if (waitKey(1) == VK_ESCAPE)
			break;

		
		// 释放资源
		SafeRelease(m_pColorFrame);
		SafeRelease(m_pDepthFrame);
		SafeRelease(m_pInfraredFrame);
		SafeRelease(m_pColorFrameReference);
		SafeRelease(m_pDepthFrameReference);
		SafeRelease(m_pInfraredFrameReference);
		SafeRelease(m_pMultiFrame);
	}
	// 关闭窗口,设备
	cv::destroyAllWindows();
	m_pKinectSensor->Close();
	std::system("pause");

	return 0;
}

我们实验室的一帧数据,哈哈!  

上面的代码有内存泄露,程序运行一段时间把我的机器物理内存都占满了,下面代码更新一下!

代码在这里

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用! 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时私信沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip 基于C++实现的kinect v2.0点云数据读取成xyz坐标的demo源码.zip
使用Kinect2.0获取点云的过程可以通过以下步骤实现。首先,需要搭建相应的开发环境,包括安装Windows系统和Visual Studio 2019等软件。可以参考\[2\]中提供的源码和项目模板进行环境搭建。接下来,需要使用Kinect2.0相机进行点云图像的捕获。Kinect2.0是一款RGB-D相机,支持普通相机的拍摄和脉冲测量深度信息。可以参考\[1\]中提供的开发源码,了解Kinect2.0的原理和使用方法。在代码中,可以通过调用相应的函数获取相机的深度信息和RGB图像。最后,可以根据需要对获取点云数据进行处理和拼接,实现三维点云的应用。 #### 引用[.reference_title] - *1* *2* [深度相机Kinect2.0三维点云拼接实验(四)](https://blog.csdn.net/qq_42144047/article/details/123449528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Kinect2.0点云数据获取](https://blog.csdn.net/weixin_42651748/article/details/112053649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值