前言

  本文来结合下opencv的highgui功能显示kinect采集得来的颜色图和深度图。本来在opencv中自带了VideoCapture类的,使用该类可以直接驱动kinect设备,具体的可以参考下面的文章:http://blog.csdn.net/moc062066/article/details/6949910,也可以参考opencv提供的官方文档:http://docs.opencv.org/doc/user_guide/ug_highgui.html。这种方法用起来非常简单,不需要考虑OpenNI的驱动过程,有点像傻瓜式的操作。不过本人在使用该种方法时kinect一直驱动不成功,即使用opencv的VideoCapture类来捕捉Kinect设备的数据,一直是打不开的,即驱动不成功。但是kinect设备已经连接上了,且能运行openni中的sample,说明kinect的硬件驱动是没问题的,应该是opencv这个类的bug,网上很多人都碰到了该情况。

  所以还是使用前面2篇博文介绍的,自己用OpenNI写驱动,这样可以更深刻的对OpenNI这个库灵活运用。

  开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2+OpenCV2.4.2

  实验说明

  在用OpenCV显示OpenNI的数据时,先来了解下Kinect获取到的深度信息的一些特点,Heresy的文章:Kinect + OpenNI 的深度值 介绍得比较通俗易懂。下面是个人觉得kinect深度信息比较重要的地方:Kinect官方推荐的使用距离为1.2m到3.6m之间。其中1.2m时的精度为3mm,3.2米的时候精度越为3cm。随着距离越来越远,其检测到的精度也越来越小。精度最小为1mm,大概是距离50cm时,不过此时的点数量比较少,也不稳定,因此官方没有推荐使用这个时候的距离。

  另外还需要注意OpenNI中表示深度像素的格式为XnDepthPixel,实际上是单一channel的16位正整数,因此如果使用OpenCV来存储时,需要设定格式为CV_16UC1。因此其范围是0~65536,不过期最大的深度只能感应到10000,所以我们需要将其归一化到一个比较好的范围内。

  本文使用的是上一篇博文:Kinect+OpenNI学习笔记之3(获取kinect的数据并在Qt中显示的类的设计) 中用到的类COpenNI,该类可以方便的驱动kinect,并将获得的色彩信息和深度信息保存在共有变量中,提供其对象来调用。主函数中使用OpenCV库来创建窗口,且将Kinect获到的数据转换成OpenCV的格式,然后在创建的窗口中显示。同时也对深度图像和颜色图像进行了canny边缘检测并显示出来比较。

  实验结果

  本实验显示4幅图像,分别为颜色原图及其canny边缘检测图,深度原图及其canny边缘检测图。结果截图部分图如下:

  实验主要部分代码及注释(附录有实验工程code下载链接地址):

copenni.cpp:

#include <XnCppWrapper.h>
#include <QtGui/QtGui>
#include <iostream>using namespace xn;
using namespace std;class COpenNI
{
public:~COpenNI() {context.Release();//释放空间
    }bool Initial() {//初始化status = context.Init();if(CheckError("Context initial failed!")) {return false;}context.SetGlobalMirror(true);//设置镜像//产生图片nodestatus = image_generator.Create(context);if(CheckError("Create image generator  error!")) {return false;}//产生深度nodestatus = depth_generator.Create(context);if(CheckError("Create depth generator  error!")) {return false;}//视角校正status = depth_generator.GetAlternativeViewPointCap().SetViewPoint(image_generator);if(CheckError("Can't set the alternative view point on depth generator")) {return false;}return true;}bool Start() {status = context.StartGeneratingAll();if(CheckError("Start generating error!")) {return false;}return true;}bool UpdateData() {status = context.WaitNoneUpdateAll();if(CheckError("Update date error!")) {return false;}//获取数据
        image_generator.GetMetaData(image_metadata);depth_generator.GetMetaData(depth_metadata);return true;}public:DepthMetaData depth_metadata;ImageMetaData image_metadata;private://该函数返回真代表出现了错误,返回假代表正确bool CheckError(const char* error) {if(status != XN_STATUS_OK ) {QMessageBox::critical(NULL, error, xnGetStatusString(status));cerr << error << ": " << xnGetStatusString( status ) << endl;return true;}return false;}private:XnStatus    status;Context     context;DepthGenerator  depth_generator;ImageGenerator  image_generator;
};

main.cpp:

#include <QCoreApplication>#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/core/core.hpp>
#include "copenni.cpp"#include <iostream>using namespace cv;
using namespace xn;int main (int argc, char **argv)
{COpenNI openni;if(!openni.Initial())return 1;namedWindow("color image", CV_WINDOW_AUTOSIZE);namedWindow("color edge detect", CV_WINDOW_AUTOSIZE);namedWindow("depth image", CV_WINDOW_AUTOSIZE);namedWindow("depth edge detect", CV_WINDOW_AUTOSIZE);if(!openni.Start())return 1;while(1) {if(!openni.UpdateData()) {return 1;}/*获取并显示色彩图像*/Mat color_image_src(openni.image_metadata.YRes(), openni.image_metadata.XRes(),CV_8UC3, (char *)openni.image_metadata.Data());Mat color_image;cvtColor(color_image_src, color_image, CV_RGB2BGR);imshow("color image", color_image);/*对色彩图像进行canny边缘检测并显示*/Mat color_image_gray, color_image_edge;cvtColor(color_image_src, color_image_gray, CV_RGB2GRAY);//因为在进行边缘检测的时候只能使用灰度图像Canny(color_image_gray, color_image_edge, 5, 100);imshow("color edge detect", color_image_edge);/*获取并显示深度图像*/Mat depth_image_src(openni.depth_metadata.YRes(), openni.depth_metadata.XRes(),CV_16UC1, (char *)openni.depth_metadata.Data());//因为kinect获取到的深度图像实际上是无符号的16位数据
        Mat depth_image, depth_image_edge;depth_image_src.convertTo(depth_image, CV_8U, 255.0/8000);imshow("depth image", depth_image);/*计算深度图像的canny边缘并显示*/Canny(depth_image, depth_image_edge, 5, 100);imshow("depth edge detect", depth_image_edge);waitKey(30);}}

  总结:本实验将OpenNI驱动的Kinect数据转换成OpenCV中方便处理的格式,达到了将OpenNI和OpenCV两者相结合的目的。

  参考资料:

Kinect+OpenNI学习笔记之3(获取kinect的数据并在Qt中显示的类的设计)

opencv2.3读取kinect深度信息和彩色图像

Kinect + OpenNI 的深度值

OpenNI + OpenCV

  附录: 实验工程code下载。

转载于:https://www.cnblogs.com/tornadomeet/archive/2012/10/01/2709851.html

Kinect+OpenNI学习笔记之4(OpenNI获取的图像结合OpenCV显示)相关推荐

  1. java openni rgb显示_Kinect+OpenNI学习笔记之4(OpenNI获取的图像结合OpenCV显示)

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

  2. Kinect+OpenNI学习笔记之11(OpenNI驱动kinect手势相关的类的设计)

    前言 本文所设计的类主要是和人体的手部打交道的,与人体的检测,姿势校正,骨架跟踪没有关系,所以本次类的设计中是在前面的OpenNI+Kinect系列博文基础上去掉那些与手势无关的驱动,较小代码量负担. ...

  3. Kinect+OpenNI学习笔记之13(Kinect驱动类,OpenCV显示类和手部预分割类的设计)

    前言 为了减小以后项目的开发效率,本次实验将OpenNI底层驱动Kinect,OpenCV初步处理OpenNI获得的原始数据,以及手势识别中的分割(因为本系统最后是开发手势识别的)这3个部分的功能单独 ...

  4. Kinect+OpenNI学习笔记之6(获取人体骨架并在Qt中显示)

    前言 MS的kinec SDK和OpenNI都提供了人体骨骼跟踪的算法,人体骨骼跟踪算法在kinect人体行为识别中非常重要,该识别过程通常被用来作为行为识别的第一步, 比如说,通过定位人体中的骨骼支 ...

  5. Kinect开发学习笔记之(二)Kinect开发学习资源整理

    Kinect开发学习笔记之(二)Kinect开发学习资源整理 zouxy09@qq.com http://blog.csdn.net/zouxy09 刚刚接触Kinect,在网上狂搜资料,获得了很多有 ...

  6. Kinect的学习笔记发展(一)Kinect引进和应用

    Kinect的学习笔记发展(一)Kinect引进和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...

  7. Kinect的学习笔记发展一Kinect引进和应用

    Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...

  8. Kinect开发学习笔记之(八)彩色、深度、骨骼和用户抠图结合

    Kinect开发学习笔记之(八)彩色.深度.骨骼和用户抠图结合 zouxy09@qq.com http://blog.csdn.net/zouxy09 我的Kinect开发平台是: Win7 x86 ...

  9. Kinect开发学习笔记之(七)骨骼数据的提取

    Kinect开发学习笔记之(七)骨骼数据的提取 zouxy09@qq.com http://blog.csdn.net/zouxy09 我的Kinect开发平台是: Win7x86 + VS2010 ...

最新文章

  1. hdu3594 强连通 tarjan
  2. 显示屏连接控制卡超时_小间距led显示屏的安装步骤
  3. spring map使用annotation泛型注入问题分析
  4. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作
  5. 饿了么element UIel-dialog弹出层/el-dialog修改默认样式不能在style scoped修改
  6. Wireshark 的使用 —— 过滤器(filter)
  7. 设计模式---外观模式(C++实现)
  8. git version可以卸载吗_「玩转Git命令」作为代码奴,该安装Git啦
  9. 一文掌握 Linux 性能分析之 CPU 篇
  10. 线性代数 行列式 知识技巧思维导图 [21考研上岸之旅]
  11. cad卸载不干净_Adobe系列软件总是卸载不干净?试试这个Adobe卸载工具
  12. 中控指纹仪linux驱动下载,中控zk4500指纹采集器驱动下载_中控zk4500指纹采集器驱动官方下载-太平洋下载中心...
  13. 关于:使用 OCT 自定义部署 Office 2007-2016
  14. 英语打卡3:可数名词
  15. Python绘制中国地图
  16. 1 Pandas实例(一)-2012美国大选政治献金实例
  17. 关于opencv新版无法使用LSD算法的问题
  18. 删除shipyard
  19. 学java,报班还是自学?
  20. 美杂志公布全球最重要六大科学实验(组图)

热门文章

  1. Python 数值计算库之-[Pandas](六)
  2. 人的大脑皮层对产品设计有何启发?
  3. Windows server 2008 r2企业版安装步骤
  4. 基于nuxt和iview搭建OM后台管理系统实践(2)-quill富文本组件的封装
  5. 2519485c7dcfe0295a41d4e0f69bb10a 求解
  6. 文件或目录权限chmod,更改所有者和所属组chown ,umask的使用 ,隐藏权限的使用 lsattr,chattr...
  7. 从更底层研究C\C++动态内存分配
  8. 前台页面Base64加密与服务端Base64解密
  9. Neutron 架构 - 每天5分钟玩转 OpenStack(67)
  10. cache目录没有权限