1. 程式人生 > >Kinect2.0點雲資料獲取

Kinect2.0點雲資料獲取

#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;
}

相關推薦

Kinect2.0資料獲取

#include "stdafx.h" #include "kinect.h" #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g

[硬體]三維資料獲取

A laser mount on a tilting unit. 目前的硬體獲取資料出現了這麼個問題,應該是鐳射沒有安裝好,掃描方向沒有真正沿著鉛錘方向。考慮進行校準。  初步校正了一下,可以差不多看了,不過發現北陽的誤差真的很大啊!北陽激光采集點本身需要運動補償嗎? (PS:點雲資料誤差大的原

三維資料

轉載! 三維點雲 幾何空間的三維掃描資料(加紋理)GeometryHub(幾何空間) 歐特克的研究——數字210金歐特克的樣品掃描和影象資料研究辦公室。 自治系統實驗室(乙)鐳射和Kinect結構化和非結構化的資料環境。 這一組有一個有用的相關

3D資料分析:pointNet++論文分析及閱讀筆記

PointNet的缺點: PointNet不捕獲由度量空間點引起的區域性結構,限制了它識別細粒度圖案和泛化到複雜場景的能力。  利用度量空間距離,我們的網路能夠通過增加上下文尺度來學習區域性特徵。 點集通常採用不同的密度進行取樣,這導致在統一密度下訓練的網路的效能大大降低。

【深度學習】三維資料集總結

點雲資料集總結 三維點雲資料,三維深度學習 1.ShapeNet ShapeNet是一個豐富標註的大規模點雲資料集,其中包含了55中常見的物品類別和513000個三維模型。 2.ShapeNetSem 這是一個小的資料庫,包含了270類的12000個物

PCL學習筆記——讀入txt格式資料,寫入到PCD檔案中

讀入txt格式點雲資料,寫入PCD檔案中 // An highlighted block // pointclouds_octree.cpp: 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include<iostream> #include

Matlab讀取資料 + 顯示

求matlab讀取三維點雲資料的程式。 clear A=importdata(‘data.txt’); [IX,IY]=size(A); x=A(:,1); y=A(:,1); y=A(:,2); z=A(:,3); plot3(x,y,z,’.’);

資料

package cn.thu.util; import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random; public class

將ContextCapture生成的資料轉化為PCL可以處理的資料格式

示例程式碼: file = open('point2.txt') # 讀取所需資料 val_list = file.readlines() list_x = [] list_y = [] list_z = [] list_rgb = [] for string in val_list:

從PCD檔案中讀取資料(Reading Point Cloud data from PCD files)

在本教程中,我們將學習如何從PCD檔案中讀取點雲資料。 #程式碼 首先,在你最喜歡的編輯器中建立一個名為pcd_read.cpp的檔案,並在其中放置下面的程式碼: #include <iostream> #include <pcl/io/pcd

Ros kinect資料

平臺 ubuntu 14.04 Ros indigo 依次執行以下命令 執行模擬的turtlebot roslaunch rbx1_bringup fake_turtlebot

資料,你怎麼看?

 最近在看點雲資料,但是中文資料很不全,百度一下什麼也沒有。我就小結一下點雲資料,和大家分享一下。 點雲資料 一:什麼是點雲資料 點雲資料是指在一個三維座標系統中的一組向量的集合。這些向量通常以X

ccf資料處理

儲存一下當時如何處理資料的 1.將csv檔案儲存為h5檔案 import numpy as np import h5py L0 = np.loadtxt(open(".\category0.csv","rb"),delimiter=",",skiprows=0) L1 = np.lo

雙邊濾波演算法在資料處理時的應用

雙邊濾波演算法在點雲資料處理時的應用 簡介(摘自百科) 雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合影象的空間鄰近度和畫素值相似度的一種折中處理,同時考慮空域資訊和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、區域性的特點 。雙邊濾波器的好處是可以做

將velodyne三維鐳射的資料(16條射線)轉換到laserscan

真正實現機制是velodyne裡的velodyne_laserscan執行velodyne_pointcloud中的VLP16_points.launch第11行是修改感測器掃描的距離,第49行是將感測器的點雲資料(16條射線)抽取出一條,轉換為laserscan.轉換規則如

OrbSLAM2採集資料

因為條件限制,在Windows10平臺下實現OrbSLAM2+Kinect2點雲資料採集。 1. 遇到問題,啟動執行沒多久就跟丟了,有的地方哪怕輕微的旋轉甚至不動都無法跟蹤。 原因:相機的標定引數不對,fx和cx引數搞反了。其實應該從獲取的稀疏點雲中能夠看出來有問題,稀疏點雲的形狀和分佈就不對。 2.將

[硬體]資料採集2

  採用GMapping定位,增加一個垂直掃描的2D鐳射實時採集三維點雲。   發現GMapping的定位精度還是沒有辦法滿足高精度點雲採集位姿的需要。尤其是當旋轉的速度比較大的時候,位姿精度更差。原因是掃描匹配可以獲取較高精度的位姿,但是兩次掃描匹配之間的運動只有里程計相對運動資料,因此里程計誤差嚴重。

資料處理學習筆記

三維計算視覺研究內容包括:   (1)三維匹配:兩幀或者多幀點雲資料之間的匹配,因為鐳射掃描光束受物體遮擋的原因,不可能通過一次掃描完成對整個物體的三維點雲的獲取。因此需要從不同的位置和角度對物體進行掃描。三維匹配的目的就是把相鄰掃描的點雲資料拼接在一起。三維匹配重點關注匹配演算法,常用的演算法有最近點迭代

PCL中訪問資料的幾種方式

    最近在看PCL的教程,發現對點雲中具體資料點的訪問也有好幾種方式,看著看著就會混淆了,所以,現將每種方式記錄下來,做個對比,方便隨時複習,溫故知新。一、第一種是在看《How to create a range image from a point cloud》教程時看

處理資料(四):到影象平面的投影

點雲到影象平面的投影 座標系的定義 相機(x:右,y:下,z:前) 點雲(x:前,y:左,z:上) 讀取感測器校準引數 在KITTI資料集raw_data中有兩個感測器校準引數檔案calib_cam_to_cam.txt(相機到相機的標定) 和