采用:win10+VS2013+PCL1.8+opencv2.4.13+kinect1.8获取深度图、彩色图以及将深度图转换为pcd格式的点云

我再操作的过程是这样做的:
(1)下载好对应版本的软件
(2)单独配置好每一个环境,(下面opencv的实现过程会教你如何以一次实现永久配置PCL配置好以后)用实例去实现一下;
(3)再把他们创建的环境模块导入新建好的项目中,同时添加好Kinect的相关配置,导入代码,运行得到结果。

1版本及安装

  • VS2013

      VS2013,上网找个别的网友提供的资料安装好就可以了。
    
  • Kinect1.8

      Kinect 1.7、1.8、2.0版本都是ok的,我个人比较喜欢2.0版本的,我再
      学习的过程中是先安好2.0版本,后来发现代码是1版本的,所以.......
    

版本1的Toolk可能安装不上,我就安装不上,但是没有关系,SDK安装好,有了驱动就可以用了。

  • opencv2.4.13

     opencv2.4.13的安装也没有太多需要注意的。
    
  • PCL1.8

     PCL安装有主意事项,open NI安装的位置,留意一下,具体参考网上资料,大家都对。
    

2环境配置

注意事项1
每一次安装好一个软件之后,需要去系统环境中添加变量,方法都一样,大家看着一个操作就好了。每次添加完变量记得重启电脑

注意事项2
无论是PCL还是opencv得配置,【debug】对应选择一种:64或者w32

注意事项3
环境配置的时候有【Debug】和【Release】两种,只需要配置【Debug】就好了。

重点
推荐一个大佬写的博客:一次性配置opencv:链接

环境配置这里一共有三个:PCL,Kinect,opencv,参考opencv得把PCL得也配置好,kinect在新项目的时候单独配置一下就好了。

	kinect得配置参考:[添加链接描述](https://blog.csdn.net/u012750277/article/details/54729583)
	我只用到下列两项就可以:加入kinect20.lib会报错
	项目->属性->C/C++->常规->附加包含目录中添加$(KINECTSDK20_DIR)\inc;
	链接器->常规->附加库目录中添加$(KINECTSDK20_DIR)\Lib\x86

在这里我只是列出了需要什么,需要注意什么,步骤之列等,比较简单,也没有配图什么的,我的这个是适用于我自己,不是普适性得,所以大部分参考以及有的网友写好的就好了,我自己轻松一些。

3 代码

#include 
#include 
// 标准库头文件
#include 
#include 
#include  
// OpenCV头文件
#include 
#include 
#include  
// OpenNI头文件
#include  
typedef unsigned char uint8_t;
// namespace
using namespace std;
using namespace openni;
using namespace cv;
using namespace pcl;

void CheckOpenNIError(Status result, string status)
{
	if (result != STATUS_OK)
		cerr << status << " Error: " << OpenNI::getExtendedError() << endl;
}

int main(int argc, char **argv)
{
	Status result = STATUS_OK;
	int i, j;
	float x = 0.0, y = 0.0, z = 0.0, xx = 0.0;
	IplImage *test;
	IplImage *test2;

	//point cloud 
	PointCloud cloud;

	//opencv image
	Mat cvBGRImg;
	Mat cvDepthImg;

	//OpenNI2 image  
	VideoFrameRef oniDepthImg;
	VideoFrameRef oniColorImg;

	namedWindow("depth");
	namedWindow("image");

	char key = 0;

	// 初始化OpenNI  
	result = OpenNI::initialize();
	CheckOpenNIError(result, "initialize context");

	// open device    
	Device device;
	result = device.open(openni::ANY_DEVICE);
	CheckOpenNIError(result, "open device");


	// create depth stream 
	VideoStream oniDepthStream;
	result = oniDepthStream.create(device, openni::SENSOR_DEPTH);
	CheckOpenNIError(result, "create depth stream");

	// set depth video mode  
	VideoMode modeDepth;
	modeDepth.setResolution(640, 480);
	modeDepth.setFps(30);
	modeDepth.setPixelFormat(PIXEL_FORMAT_DEPTH_1_MM);
	oniDepthStream.setVideoMode(modeDepth);
	// start depth stream  
	result = oniDepthStream.start();
	CheckOpenNIError(result, "start depth stream");

	// create color stream  
	VideoStream oniColorStream;
	result = oniColorStream.create(device, openni::SENSOR_COLOR);
	CheckOpenNIError(result, "create color stream");
	// set color video mode  
	VideoMode modeColor;
	modeColor.setResolution(640, 480);
	modeColor.setFps(30);
	modeColor.setPixelFormat(PIXEL_FORMAT_RGB888);
	oniColorStream.setVideoMode(modeColor);
	// start color stream  
	result = oniColorStream.start();
	CheckOpenNIError(result, "start color stream");

	while (true)
	{
		// read frame  
		if (oniColorStream.readFrame(&oniColorImg) == STATUS_OK)
		{
			// convert data into OpenCV type  
			Mat cvRGBImg(oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData());
			cvtColor(cvRGBImg, cvBGRImg, CV_RGB2BGR);
			imshow("image", cvBGRImg);
		}

		if (oniDepthStream.readFrame(&oniDepthImg) == STATUS_OK)
		{
			Mat cvRawImg16U(oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData());
			cvRawImg16U.convertTo(cvDepthImg, CV_8U, 255.0 / (oniDepthStream.getMaxPixelValue()));
			imshow("depth", cvDepthImg);
		}
		// quit
		if (cv::waitKey(1) == 'q')
			break;
		// capture  depth and color data   
		if (cv::waitKey(1) == 'c')
		{
			//get data
			DepthPixel *pDepth = (DepthPixel*)oniDepthImg.getData();
			//create point cloud
			cloud.width = oniDepthImg.getWidth();
			cloud.height = oniDepthImg.getHeight();
			cloud.is_dense = false;
			cloud.points.resize(cloud.width * cloud.height);
			test = cvCreateImage(cvSize(cloud.width, cloud.height), IPL_DEPTH_8U, 3);
			test2 = &IplImage(cvBGRImg);

			for (i = 0; iimageData[i*test2->widthStep + j * 3 + 0];
					cloud[i*cloud.width + j].g = (uint8_t)test2->imageData[i*test2->widthStep + j * 3 + 1];
					cloud[i*cloud.width + j].r = (uint8_t)test2->imageData[i*test2->widthStep + j * 3 + 2];
					test->imageData[i*test->widthStep + j * 3 + 0] = test2->imageData[i*test2->widthStep + j * 3 + 0];
					test->imageData[i*test->widthStep + j * 3 + 1] = test2->imageData[i*test2->widthStep + j * 3 + 1];
					test->imageData[i*test->widthStep + j * 3 + 2] = test2->imageData[i*test2->widthStep + j * 3 + 2];
				}
			}

			cvSaveImage("test.jpg", test);
			pcl::io::savePCDFileBinaryCompressed("test_pcdc.pcd", cloud);
			cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << endl;
			imwrite("c_color.jpg", cvBGRImg);
			imwrite("c_depth.jpg", cvDepthImg);
			/*for(size_t i=0;i

如有任何问题,可以查看主页的联系方式联系我。我的原始项目代码可见于:可以下载完整的,需要5个积分,不是我定的,搜索我的主页应该能找到,题目是一样的。

你可能感兴趣的:(采用:win10+VS2013+PCL1.8+opencv2.4.13+kinect1.8获取深度图、彩色图以及将深度图转换为pcd格式的点云)