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的东西,争取给出以下效果:



目录
相关文章
|
6月前
|
算法
[Halcon&标定] 相机自标定
[Halcon&标定] 相机自标定
148 1
|
6月前
|
编解码 对象存储 UED
[Halcon&标定] 单相机标定
[Halcon&标定] 单相机标定
199 1
|
6月前
|
传感器 机器学习/深度学习 存储
使用激光雷达(LiDAR)和相机进行3D物体跟踪
使用激光雷达(LiDAR)和相机进行3D物体跟踪
|
C++ Python
C++ PCL三维点云物体目标识别
C++ PCL三维点云物体目标识别
793 1
C++ PCL三维点云物体目标识别
|
传感器 索引
在 ArcGIS 中由激光雷达创建强度图像
强度是反映生成某点的激光雷达脉冲回波强度的一种测量指标(针对每个点而采集)。该值在一定程度上基于被激光雷达脉冲扫到的对象的反射率。其他对强度的描述包括“回波脉冲振幅”和“反射的后向散射强度”。反射率是所用波长(通常是在近红外波段)的函数。
102 0
相机和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中搭建仿真场景
|
机器学习/深度学习 Ubuntu 开发工具
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 介绍
**什么是相机与激光雷达外参标定?** 就是相机坐标系和激光雷达坐标系的TF变化。位置x,y,z 欧拉角 roll,pitch,yaw,6个变量构成一个4*4的旋转变换矩阵 标定的就是这个4维的旋转矩阵。 标定的方法有: - 基于特征 - 基于运动观测 - 基于最大化互信息 - 基于深度学习 基于特征 的方法是根据对应特征点求解PnP问题,需要标定板来获取特征 基于运动观测可以看作手眼标定问题,精度决定于相机和雷达的运动估计 基于最大化互信息认为图像灰度于反射强度具有相关性 基于深度学习需要长时间的训练并且泛化能力不高
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 介绍
|
数据采集 传感器
相机与激光雷达标定: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---相机内参标定
Halcon标定系列(2):使用Halcon算子制作标定板
Halcon标定系列(2):使用Halcon算子制作标定板
503 0
Halcon标定系列(2):使用Halcon算子制作标定板