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(相機到相機的標定) 和