最近搞了个奥比中光的深度摄像头,需要通过摄像头获取点云数据,先后查阅了很多资料。

自己写了几个功能的C++程序:

1.采集点云数据(我这里设置的是0.8米以内,具体数值可以自己更改)
2.在控制台输入!号,设置采集数据存放的根目录
3.在控制台按空格键,输入在根目录下要新建的用户文件夹
4.在控制台按回车键,保存当前点云数据
5.在depth显示窗口按Esc退出程序

/*************************
OpenNI2 Point-cloud collect program
Author: Danqing Miao, 2018.11
*************************/#include <stdlib.h>
#include <iostream>
#include <string>
#include <fstream>
#include <direct.h>
#include "OpenNI.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"//获取键盘输入
#include <conio.h>
#include <Windows.h>
using namespace std;
using namespace cv;
using namespace openni;
typedef struct {float x;float y;float z;
} vector3f;#define SAMPLE_READ_WAIT_TIMEOUT 2000 //2000ms
void CheckOpenNIError(Status result, string status)
{if (result != STATUS_OK)cerr << status << " Error: " << OpenNI::getExtendedError() << endl;
}///
string dirpath;
string getpath()
{std::cin >> dirpath;return dirpath;
}string dirname;
string makedir()
{string filepath;std::cin >> filepath;dirname = dirpath +"\\"+ filepath;_mkdir(dirname.c_str());return dirname;
}int jishu = 0;
void screenshot(vector<vector3f> point)
{ofstream outfile;string filenames;stringstream name;name << jishu;name >> filenames;outfile.open(dirname +"\\"+ filenames + ".xyz");Sleep(50);for (int ii = 0; ii < 640 * 400; ii++){if (point[ii].z != 0 && point[ii].z < 800){outfile << point[ii].x << " " << point[ii].y << " " << point[ii].z << std::endl;}}outfile.close();cout << dirname << "\\" <<filenames << ".xyz ,save successful!"<<endl;
}
///int main(int argc, char** argv)
{Status result = STATUS_OK;//OpenNI2 Frame   VideoFrameRef oniDepthImg;//OpenCV image    cv::Mat cvDepthImg;cv::Mat cvFusionImg;cv::namedWindow("depth");char key = 0;//【1】    const char* deviceURI = openni::ANY_DEVICE;if (argc > 1){deviceURI = argv[1];}result = OpenNI::initialize();CheckOpenNIError(result, "initialize context");if (result != STATUS_OK){printf("Initialize failed\n%s\n", OpenNI::getExtendedError());return 1;}Device device;if (argc < 2)result = device.open(ANY_DEVICE);elseresult = device.open(argv[1]);if (result != STATUS_OK){printf("Couldn't open device\n%s\n", OpenNI::getExtendedError());return 2;}//【2】    // create depth stream     VideoStream oniDepthStream;result = oniDepthStream.create(device, openni::SENSOR_DEPTH);//【3】    // set depth video mode    VideoMode modeDepth;modeDepth.setResolution(640, 400);modeDepth.setFps(30);modeDepth.setPixelFormat(PIXEL_FORMAT_DEPTH_1_MM);oniDepthStream.setVideoMode(modeDepth);// start depth stream    result = oniDepthStream.start();//【4】    // set depth and color imge registration mode    if (device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR)){device.setImageRegistrationMode(IMAGE_REGISTRATION_DEPTH_TO_COLOR);}int ch;while (key != 27){// read frame    int changedStreamDummy;VideoStream* pStream = &oniDepthStream;result = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT);if (oniDepthStream.readFrame(&oniDepthImg) == STATUS_OK){cv::Mat cvRawImg16U(oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData());//cvRawImg16U.convertTo(cvDepthImg, CV_8U, 255.0 / (oniDepthStream.getMaxPixelValue()));cvRawImg16U.convertTo(cvDepthImg, CV_8U, 255.0 / 800);//【5】    // convert depth image GRAY to BGR    cv::cvtColor(cvDepthImg, cvFusionImg, CV_GRAY2BGR);cv::imshow("depth", cvFusionImg);}DepthPixel* pDepth = (DepthPixel*)oniDepthImg.getData();vector3f xyzdata;vector<vector3f> point;float x = 0.0, y = 0.0, z = 0.0, depthv = 0.0;float i, j;for (i = 0; i < oniDepthImg.getHeight(); i++){for (j = 0; j < oniDepthImg.getWidth(); j++){int k = i;int m = j;depthv = pDepth[k*oniDepthImg.getWidth() + m];CoordinateConverter::convertDepthToWorld(oniDepthStream, j, i, depthv, &x, &y, &z);xyzdata.x = x;xyzdata.y = y;xyzdata.z = z;point.push_back(xyzdata);}}if (_kbhit()&&jishu < 100){//如果有按键按下,则_kbhit()函数返回真ch = _getch();//使用_getch()函数获取按下的键值if (ch == 33){printf("please input point-cloud collect path:");getpath();}if (ch == 32){printf("please input users path:");makedir();jishu = 0;}if (ch == 13){screenshot(point);}jishu = jishu + 1;}key = cv::waitKey(20);}cv::destroyWindow("depth");//OpenNI2 destroy    oniDepthStream.destroy();device.close();OpenNI::shutdown();return 0;
}

获取到的点云数据如下图:

OpenNI深度图获取点云数据相关推荐

  1. gazebo 仿真 kinect 获取点云数据

    项目地址:https://github.com/yym68686/ros-slam 简介 使用 urdf 文件构建仿真机器人,在 gazebo 搭建仿真环境,导入人造卫星的 stl 文件,利用仿真 k ...

  2. PCL学习笔记(3)——openni2_grabber从相机获取点云数据

    源码 #include <pcl/io/openni2_grabber.h> #include <pcl/visualization/cloud_viewer.h> #incl ...

  3. realsense R200 获取点云数据

    ros wiki中指出 enable_pointcloud(bool,默认值:false) 指定是否启用本机pointcloud.默认情况下,由于性能问题,它设置为false.此选项折旧以支持rgbd ...

  4. io获取 pcl_点云数据可视化之PCL滤波学习

    PCL滤波概述 在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中将不可避免的出现一些噪声.在点云处理流 ...

  5. PCL学习记录--点云数据的获取与可视化

    1.获取点云数据 (1)点云定义 pointCloud = std::make_shared<pcl::PointCloud<pcl::PointXYZ>>(); (2)获取相 ...

  6. Intel realsense SR300深度图获取点云和点云投影至图像全流程

    从深度图获取点云 之前用的方法一直都是利用深度图的像素坐标(x,y)和像素值z自行计算点云,代码如下 for (int m = 0; m < depth.rows; m++){for (int ...

  7. 从零实现无序抓取(四)如何获取点云位姿估计真值

    前言 这是一章预告. 上一章在进行点云位姿估计时,我们利用PCL库对原始点云进行了一个人工设定的变换矩阵,这个变换矩阵可以作为位姿估计的真值.但是这种方式只能很简单地将某个原始点云整体进行变换.也就是 ...

  8. Azure Kinect DK + Ubuntu 18.04,从相机获取图像和点云数据

    前言 1. 相机驱动和SDK的准备 在Ubuntu 18.04系统下安装Azure Kinect DK 深度相机驱动和SDK,可以参考我的另一篇博客:https://blog.csdn.net/den ...

  9. 3D点云数据结合深度学习入门基础(目标篇)

    最近,老师让我们研究深度学习与3D点云数据的研究方向,开始时,确实也不清楚何为3D点云,以及深度学习. 由于实验室师弟师妹全部是做深度学习识图相关横向研究工作的,所以很快的就掌握了,深度学习识图技术, ...

最新文章

  1. 对javascript作用域链的理解
  2. python基本使用-Python的基本用法
  3. 【POJ - 3273 】Monthly Expense (二分,最小最大值)
  4. 百度 合肥地区 软件研发工程师 笔试题
  5. CDN的安全防护功能
  6. Nginx负载均衡,ssl原理,生成ssl密钥对,Nginx配置ssl
  7. 语音分享应用ios源码项目
  8. switch支持的类型
  9. zTree实现树的模糊搜索功能
  10. 2022年湖北大学招生简章--成人高等教育高起专、专升本学历提升
  11. llvm安装方式_LLVM 安装教程(包安装)
  12. openstack创建云主机流程
  13. word公式编辑中字号大小设置参照表
  14. QMessageBox 换中文 确定和取消按钮
  15. 【论文阅读 CIKM‘2021】Learning Multiple Intent Representations for Search Queries
  16. php课设报告致谢_PHP程序员转正申请书
  17. 子串查询(子序列查询)
  18. HashMap夺命14问,你能坚持到第几问?
  19. 51nod oj 1489 蜥蜴和地下室【dfs】
  20. 在Virtual Box的shared folder中编译android源码。

热门文章

  1. Android应用加固的简单实现方案
  2. 云服务器最佳实践-Linux云服务器SSH登录的安全加固
  3. S7-200 Smart入门笔记7——中断2
  4. 单元测试JUnit 4
  5. '.'和'-'使用过程中的注意事项
  6. java面板和框架_java 框架/面板
  7. node - glob模块
  8. 机器学习 SVM感想
  9. 关于vi编辑器命令大全 以及vim 补充
  10. 【CF 149D】Coloring Brackets(dp)