参考:小斤的博客

1.创建你的包

  catkin_create_pkg depth_rgb_image

2.

  将以下代码粘贴到src/depth_rgb_image.cpp

  

#include <stdlib.h>
#include <iostream>
#include <string>
//【1】
#include <XnCppWrapper.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"using namespace std;
using namespace cv;void CheckOpenNIError( XnStatus result, string status )
{ if( result != XN_STATUS_OK ) cerr << status << " Error: " << xnGetStatusString( result ) << endl;
}int main( int argc, char** argv )
{XnStatus result = XN_STATUS_OK;  xn::DepthMetaData depthMD;xn::ImageMetaData imageMD;//OpenCVIplImage*  imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1);IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);IplImage*  depthShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);IplImage* imageShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);cvNamedWindow("depth",1);cvNamedWindow("image",1);char key=0;//【2】// context
    xn::Context context; result = context.Init(); CheckOpenNIError( result, "initialize context" );  // creategenerator
    xn::DepthGenerator depthGenerator;  result = depthGenerator.Create( context ); CheckOpenNIError( result, "Create depth generator" );  xn::ImageGenerator imageGenerator;result = imageGenerator.Create( context ); CheckOpenNIError( result, "Create image generator" );//【3】//map mode
    XnMapOutputMode mapMode; mapMode.nXRes = 640;  mapMode.nYRes = 480; mapMode.nFPS = 30; result = depthGenerator.SetMapOutputMode( mapMode );  result = imageGenerator.SetMapOutputMode( mapMode );  //【4】// correct view port
    depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator ); //【5】//read dataresult = context.StartGeneratingAll();  //【6】result = context.WaitNoneUpdateAll();  while( (key!=27) && !(result = context.WaitNoneUpdateAll( ))  ) {  //get meta data
        depthGenerator.GetMetaData(depthMD); imageGenerator.GetMetaData(imageMD);//【7】//OpenCV outputmemcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3);cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR);cvShowImage("depth", depthShow);cvShowImage("image",imageShow);key=cvWaitKey(20);}//destroycvDestroyWindow("depth");cvDestroyWindow("image");cvReleaseImage(&imgDepth16u);cvReleaseImage(&imgRGB8u);cvReleaseImage(&depthShow);cvReleaseImage(&imageShow);context.StopGeneratingAll();context.Shutdown();return 0;
}

3.代码解释

【1】<XnCppWrapper.h>便是OpenNI的文件头了,使用OpenNI的话,目前只要include这个就行。

【2】DepthGenerator和ImageGenerator,小斤称之为图像生成器,前者负责深度图像,后者负责彩色图像。创建一个生成器非常简单,首先我们要初始化一个Context上下文,然后把Context作为Create函数的参数,便可以创建生成器了。

【3】XnMapOutputMode是用来设定生成器的参数的,这边小斤设定了分辨率为640*480(标准),30fps采样。

【4】depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator)这句话也许会让大家疑惑,它是用来调整视角的。为什么要调整呢?因为Kinect的三只眼长在不同的地方,所以画幅一致的深度摄像头和彩色摄像头,它们看出来的景物是有偏差的,这里OpenNI提供了函数进行对齐。这里,小斤把深度生成器的视角,设定为彩色生成器的视角。

【5】调用StartGeneratingAll()后,生成器们便开始上班了,如果要结束,就StopGeneratingAll()函数。

【6】尽管生成器们在工作了,但他们一直忙着各读各的,没有人协调,自己不会乖乖把最新的资料给我们。我们调用getMetaData()方法前,需要使用WaitAnyUpdateAll()、WaitOneUpdateAll()、WaitNoneUpdateAll()和WiatAndUpdateAll()中的一种。功能如其名,这边小斤使用的是WaitNoneUpdateAll()函数,它比较暴力,不管生成器有没有读到新数据,我这边先更新了再说。大家可以试试其它三个,看看效果。

【7】这边使用OpenNI获得图像MetaData数据后,小斤通过一系列函数,转换为OpenCV的IplImage图像类型,然后输出。主要参考了这篇文章。

对于深度MetaData,这边使用cvConvertScale转换尺度,成为灰度值[0,255]的灰度图。对于彩色MetaData,使用cvCvtColor转换色彩空间即可。

4.打开package.xml,添加

<build_depend>XnCppWrapper</build_depend><run_depend>XnCppWrapper</run_depend><cpp cflags="-I/你的OPENNI路径"/>

5.打开CMakeLists.txt,添加

find_package( OpenCV REQUIRED )
include_directories(${OpenCV_INCLUDE_DIRS}"/usr/include/ni"
)
add_executable(depth_rgb_image src/depth_rgb_image.cpp)
target_link_libraries(depth_rgb_image OpenNI ${OpenCV_LIBRARIES} )

6.编译代码

cd %TOP_DIR_YOUR_CATKIN_WORKSPACE%
catkin_make

7.运行代码

rosrun depth_rgb_image depth_rgb_image  

如果以上代码不能运行,请新source你的setup.bash

8.退出ctrl+c

9.用rivz显示

  1)

rosmake rviz

  2)

rosrun depth_rbg_image depth_rbg_image
rosrun rviz rviz

  3)修改界面上的部分参数即可看见图像

  

转载于:https://www.cnblogs.com/Bubls/p/5278414.html

ROS kinect:OpenNI读取深度图像与彩色图像相关推荐

  1. Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示

    细心的朋友肯定已经发现Kinect上长了三只眼睛,其中一个是彩色摄像头,另外两个深度摄像头,一个负责发射红外光,一个负责接收,这样,我们便能通过Kinect得到一幅彩色图像和一幅深度图像.如果大家对K ...

  2. 深度图像和彩色图像对齐

    深度图像和彩色图像对齐 原因:由于RGB图像数据与深度图像数据的空间坐标系是不同的,前者的原点是RGB摄像头,后者的原点是红外摄像头,因此两者会有相应的误差.没对齐之前的结果如下图所示:(执行这个 b ...

  3. Python-opencv读取深度图像

    由于实验需要用到Kinect2.0采集的深度图像,但是用以下程序读取深度图片的时候显不方便观察 temp_img= 'cup_depth.png' depth_filename = os.path.j ...

  4. 英特尔Realsense学习笔记二:pyqt5 实时显示 Realsense D415 深度图像和彩色图像

    要做一个D415相机的最高分辨率的拍摄程序,深度相机最高分辨率为1280*720,普通屏幕是不能同时显示两个1280*720的,由于拍摄的时候由于是拍摄人体面部,所以深度图和彩色图像都截取中间的640 ...

  5. 深度图像和彩色图像配准原理

    https://www.cnblogs.com/cv-pr/p/5769617.html

  6. Kinect+OpenNI+OpenCV使用

    关于OpenNI,已经可以使用2.0,可以不再使用PrimeSense: 这里的是转载其他人的 OpenCV系列: 原文:http://blog.csdn.net/chenxin_130/articl ...

  7. Kinect+OpenNI学习笔记之4(OpenNI获取的图像结合OpenCV显示)

    前言 本文来结合下opencv的highgui功能显示kinect采集得来的颜色图和深度图.本来在opencv中自带了VideoCapture类的,使用该类可以直接驱动kinect设备,具体的可以参考 ...

  8. Kinect+OpenNI学习笔记之14(关于Kinect的深度信息)

    前言 由于最近要研究kinect采集到的深度信息的一些统计特征,所以必须先对kinect深度信息做进一步的了解.这些了解包括kinect的深 度值精度,深度值的具体代表的距离是指哪个距离以及kinec ...

  9. 深度图像基础知识(二)

    在计算机视觉系统中,三维场景信息为图像分割.目标检测.物体跟踪等各类计算机视觉应用提供了更多的可能性,而深度图像(Depth map)作为一种普遍的三维场景信息表达方式得到了广泛的应用.深度图像的每个 ...

最新文章

  1. double int char 数据类型
  2. 精选CVPR开源项目学习资源汇总
  3. FCN 学习: Semantic Segmentation
  4. Linux的vx开头的文件,linux文件系统简述
  5. google mock分享
  6. 信息学奥赛一本通(2064:【例2.1】交换值)
  7. KMP算法 --- 深入理解next数组
  8. mysql忘记了密码、允许远程连接、mysql卸载 -- linux
  9. python 编译器_Python教程:编译器与解释器
  10. Dockerfile制作自定义镜像
  11. 服务器脱机状态,从脱机工作切换到联机工作
  12. 信鸽 v3.0.9 安卓正式版
  13. 局域网交换机(Lan Switch)
  14. [信息论与编码] 03. 离散信源、信源熵、联合熵、条件熵
  15. Error: java.lang.RuntimeException: Some file crunching failed, see logs for details
  16. Kuma初步学习笔记-universal 模式
  17. qcon_从QCon伦敦2010中学到的重点知识和教训
  18. dell 服务器引导盘安装2003
  19. Git操作不规范,战友提刀来相见。
  20. select2 取值 遍历 设置默认值

热门文章

  1. Cartographor定位-shell脚本:不停拉起死掉的程序和脚本
  2. pip升级后Import Error:cannot import name main解决方案
  3. Caffe2:添加CUDA路径
  4. java junit autowired_写Junit测试时用Autowired注入的类实例始终为空怎么解?
  5. 2018世界杯8组32队积分和净胜球
  6. Java多线程的几种写法
  7. commons-csv 使用记叙
  8. Web 高效开发必备的 PHP 框架
  9. SpringMVC莫名其妙出现No bean named 'cacheManager' is defined错误
  10. 因为喜欢,所以选择它