kinect 运用Openni2.0 产生点云

简介: 我的Kinect型号:PrimeSense  Carmine 使用Openni2.0这次比较粗糙,就是想将摄像头采集的深度信息转化为现实世界的三维坐标,然后用Opengl画出来。

我的Kinect型号:PrimeSense  Carmine 

使用Openni2.0

这次比较粗糙,就是想将摄像头采集的深度信息转化为现实世界的三维坐标,然后用Opengl画出来。

这里没有降噪、取样,所以也称不上是“点云”

原理什么的,请参考这位仁兄:http://blog.csdn.net/opensource07/article/details/7804246

他是Openni1.0做的,代码写的也比较规整,我就比较随意了,适合像我一样的新手理解


#include<gl/glut.h> 
#include <iostream>
#include <vector>
#include <OpenNI.h>
#include "OniSampleUtilities.h"
#define SAMPLE_READ_WAIT_TIMEOUT 200 //2000ms
using namespace openni;
using namespace std;

typedef struct data
{
	float x;
	float y;
	float z;
}data;


VideoStream depth;
VideoFrameRef frame;
int width;
int height;

void OpenGL_init(void)
{
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	// background color: white 
	glShadeModel(GL_FLAT);
	glClear(GL_COLOR_BUFFER_BIT);

}

void display()
{
	vector<data> point;
	data mydata;
	float x=0.0,y=0.0,z=0.0,xx=0.0;
	float i,j;

	//读取一帧
	int changedStreamDummy;
	VideoStream* pStream = &depth;
    OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT);

	depth.readFrame(&frame);
	width = frame.getWidth();
	height = frame.getHeight();

	DepthPixel *pDepth = (DepthPixel*)frame.getData();

	for(i=0;i<frame.getHeight();i++)
	{	
		for(j=0;j<frame.getWidth();j++)
		{
			int k = i;
			int m = j;
			xx = pDepth[k*frame.getWidth()+m];
			CoordinateConverter::convertDepthToWorld (depth,i,j,xx,&x,&y,&z);
			mydata.x=x*0.001;
			mydata.y=y*0.001;
			mydata.z=z*0.001;
			point.push_back(mydata);
			//cout<<xx<<endl;
		}
	}
	
	glColor3f(1.0f, 1.0f, 1.0f);
	glPointSize(0.1f);
	glBegin(GL_POINTS);

	if (point.size()!=0)
	{
		glBegin(GL_POINTS);
		for (vector<data>::iterator iter = point.begin();iter!=point.end();iter++)
		{
			glVertex3f(iter->x,iter->y,iter->z);
		}
		
	}	
	glEnd();
	glFlush();
	glutSwapBuffers();
}
void OpenGL_changeSize(int w, int h)
{
	glViewport(0, 0, GLsizei(w), GLsizei(h));
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	// 	if (w <= h)				// 正交投影
	// 		glOrtho(-2.0, 2.0, -2.0*(GLfloat)h/(GLfloat)w, 2.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
	// 	else
	// 		glOrtho(-2.0*(GLfloat)w/(GLfloat)h, 2.0*(GLfloat)w/(GLfloat)h, -2.0, 2.0, -10.0, 10.0);
	gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.1f, 50.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.1f, 0.0f, 1.0f, 0.0f);
}

void OpenGL_Idel()
{
	display();	// 刷新显示
	glClear(GL_COLOR_BUFFER_BIT);
}

int main(int argc, char **argv)
{
	Status rc = OpenNI::initialize();
	vector<data> point;
	
	Device device;
	rc = device.open(ANY_DEVICE);
	if (device.getSensorInfo(SENSOR_DEPTH) != NULL)
	{
		rc = depth.create(device, SENSOR_DEPTH);
	}

	rc = depth.start();

	glutInit(&argc,argv);  
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);  
	glutInitWindowPosition(100,100);  

	glutInitWindowSize(800, 600);  
	glutCreateWindow("first blood");  
	OpenGL_init();
	glutDisplayFunc(&display);  
	glutIdleFunc(OpenGL_Idel);
	glutMainLoop();

	return 0;
}

OPENNI2.0 sample里带的图:

背景是书架+我的手



下面这幅是还原三维世界:



下次将学习PCL的东西,争取给出以下效果:



目录
相关文章
|
3月前
|
计算机视觉
【图像处理】 Halcon 实现图像亚像素边缘检测
如何在Halcon软件中实现图像亚像素边缘检测,包括读取图片、图像阈值化、边界提取、区域扩张、亚像素边缘提取、轮廓拟合和彩色绘图等步骤,并提供了相应的Halcon代码实现和检测效果展示。
95 2
|
6月前
|
算法
[Halcon&标定] 相机自标定
[Halcon&标定] 相机自标定
157 1
|
6月前
|
编解码 对象存储 UED
[Halcon&标定] 单相机标定
[Halcon&标定] 单相机标定
212 1
|
6月前
|
传感器 机器学习/深度学习 存储
使用激光雷达(LiDAR)和相机进行3D物体跟踪
使用激光雷达(LiDAR)和相机进行3D物体跟踪
|
C++ Python
C++ PCL三维点云物体目标识别
C++ PCL三维点云物体目标识别
803 1
C++ PCL三维点云物体目标识别
相机和livox激光雷达外参标定:在gazebo中搭建仿真场景
前两篇介绍了相机和livox激光雷达外参标定:ROS功能包的livox_camera_lidar_calibration 和使用方法. 具体链接: - [链接1](https://www.guyuehome.com/38522) - [链接2](https://www.guyuehome.com/38524) 本篇在gazebo中搭建可以模拟产生livox_camera_lidar_calibration功能包需要的数据的仿真场景.
相机和livox激光雷达外参标定:在gazebo中搭建仿真场景
|
数据采集 传感器
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---标定数据采集与处理
ROS功能包:**livox_camera_lidar_calibration**提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---标定数据采集与处理
|
C++ 计算机视觉
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---相机内参标定
ROS功能包:**livox_camera_lidar_calibration**提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---相机内参标定
|
前端开发 算法 定位技术
3D激光SLAM--A-LOAM :前端lidar点特征提取部分代码解读
A-LOAM的cpp有四个,其中 kittiHelper.cpp 的作用是将kitti数据集转为rosbag 剩下的三个是作为 slam 的 部分,分别是: - laserMappin.cpp ++++ 当前帧到地图的优化 - laserOdometry.cpp ++++ 帧间里程计 - scanRegistration.cpp ++++ 前端lidar点预处理及特征提取 本片主要解读 前端lidar点特征提取部分的代码
3D激光SLAM--A-LOAM :前端lidar点特征提取部分代码解读
|
XML 传感器 并行计算
常用摄像头一些点云深度矫正ROS程序(ZED & kinect v2 & D415)(上)
常用摄像头一些点云深度矫正ROS程序(ZED & kinect v2 & D415)(上)
常用摄像头一些点云深度矫正ROS程序(ZED & kinect v2 & D415)(上)