资源简介
由kinect2.0的数据流来生成点云很容易实现,可是实用性不大,为了提高实用性,我写了一个通过读取kinect保存的jpg图片和其对应的深度txt文件,来生成点云的程序。生成的点云最终用pcl保存为ply或pcd格式的点云文件。我自己摸索的过程中走了很多弯路,分享出来帮助有相同需要的朋友们少走弯路。(注:碍于上传文件大小限制,我只上传了所有的代码以及一副实例图片和对应的深度txt文件,需自己正确配置opencv+pcl+kinect2.0)
代码片段和文件信息
//此程序功能:从jpg和txt得到点云!
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
FILE* fd;
IKinectSensor* sensor; // Kinect sensor
void retxt(UINT16 *data FILE* fp char* name)
{
fp = fopen(name “r“);
for (int i = 0; i < 512 * 424; i++)
{
fscanf(fp “%d“ data);
data++;
}
fclose(fp);
}
Mat image = imread(“p1.jpg“);//在此处读入jpg图片,要求kinect2.0尺寸的(1920*1080)
void Convertrgbdata(unsigned char pBuffer[1920 * 1080 * 4] Mat img)
{
uchar* p_mat = img.data;
const unsigned char* pBufferEnd = pBuffer + (1920 * 1080 * 4);
while (pBuffer < pBufferEnd)
{
*pBuffer = *p_mat;
p_mat++; pBuffer++;
*pBuffer = *p_mat;
p_mat++; pBuffer++;
*pBuffer = *p_mat;
p_mat++; pBuffer++;
++pBuffer;
}
}
const int width = 512;
const int height = 424;
const int colorwidth = 1920;
const int colorheight = 1080;
// Intermediate Buffers
unsigned char rgbimage[colorwidth*colorheight * 4]; // Stores RGB color image
ColorSpacePoint depth2rgb[width*height]; // Maps depth pixels to rgb pixels
CameraSpacePoint depth2xyz[width*height]; // Maps depth pixels to 3d coordinates
// Kinect Variables
ICoordinateMapper* mapper; // Converts between depth color and 3d coordinates
float* ptr = NULL;
float* ptrc = NULL;
bool initKinect() {
if (FAILED(GetDefaultKinectSensor(&sensor))) {
return false;
}
if (sensor){
sensor->get_CoordinateMapper(&mapper);
sensor->Open();
}
else {
return false;
}
}
void getDepthData(UINT16* buf float* dest char*name1) {
retxt(buf fd name1);
// Write vertex coordinates
mapper->MapDepthframeToCameraSpace(width*height buf width*height depth2xyz);
// float* fdest = (float*)dest;
for (int i = 0; i < 512 * 424; i++) {
*dest++ = depth2xyz[i].X;
*dest++ = depth2xyz[i].Y;
*dest++ = depth2xyz[i].Z;
}
// Fill in depth2rgb map
mapper->MapDepthframeToColorSpace(width*height buf width*height depth2rgb);
}
void getRgbData(unsigned char* rgbdata float* dest) {
Convertrgbdata(rgbdata image);
// Write color array for vertices
for (int i = 0; i < width*height; i++) {
ColorSpacePoint p = depth2rgb[i];
// Check if color pixel coordinates are in bounds
if (p.X < 0 || p.Y < 0 || p.X > colorwidth || p.Y > colorheight) {
*dest++ = -1;
*dest++ = -1;
*dest++ = -1;
}
else {
int idx = (int)p.X + colorwidth*(int)p.Y;
*dest++ = rgbdata[4 * idx + 2];
*dest++ = rgbdata[4 * idx + 1];
*dest++ = rgbdata[4 * idx + 0];
}
// Don‘t copy alpha channel
}
}
int main()
{
initKinect();
UINT16 *depthArray = new UINT16[512 * 424];//深度数据是16位unsigned int
ptr = (float *)malloc(512 * 424 * 3 * sizeof(float));
ptrc = (float *)malloc(512 * 424 * 3 * sizeof(float));
getDepthData(depthArray ptr “p1.txt“);//在此处读入对应于图片的深度数
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3989 2016-09-18 19:45 pcl+kinect\kinect+pcl.cpp
文件 416594 2016-09-13 09:28 pcl+kinect\p1.jpg
文件 1226056 2016-09-13 09:28 pcl+kinect\p1.txt
目录 0 2016-09-18 19:46 pcl+kinect
----------- --------- ---------- ----- ----
1646639 4
- 上一篇:office365最新版在线安装版
- 下一篇:AD USB封装库
相关资源
- kinect官方技术文档英文
- 基于 ROS 与 Kinect 的移动机器人同时定
- 微软KinectFusion开源实现
- Kinect获取彩色图像并保存为jpg图片
- kinect 2.0获取深度和彩色帧并存为jpg图
- KinectFusion: Real-time 3D Reconstruction论文翻
- 最新Kinect v2 with MS-SDK 2.10.1 for Unity3D
- 已安装ROS-Kinectic的树莓派ubuntu16的im
- Kinect for unity sdk v2.9.unitypackage
- sensor-win64-5.1.2.1-redist.msi
- Kinect2.0开发文档
- Kinect获取深度图像
- Kinect for Windows SDK开发初体验一环境配
- 多线程获取kinect2.0 视频并保存身体点
- Kinect运用OpenNI产生点云
- Kinect获取深度图,鼠标点击获取该点
- Kinect 保存彩色图和深度图
- windows intel_sdk_for_opencl
- Kinect驱动,PC上驱动之一
- Kinect for windows需要的头文件
- Kinect for windows 破解 一,简单的体感超
- Kinect中文文档,
- Kinect和Processing入门
- Kinect V2 for windows 体感控制PPT by LSS
- KinectManager解析
- kinect获取彩色数据并用图片形式进行
- KinectV2结合Processing调试驱动安装文档
- Kinect控制ppt播放.rar
- 修改后的KinectWrapper
- KinectSDK2.0面部获取
评论
共有 条评论