OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

时间:2022-05-27 20:17:05

华硕XtionPro类似Kinect,都是体感摄像机,可捕捉深度图和彩色图。

具体參数见:http://www.asus.com.cn/Multimedia/Xtion_PRO_LIVE/specifications/

实验设定的深度图和彩色图大小都是640*480,规格上说彩色图支持更大分辨率。实測假设将彩色图设定为更大分辨率则会自己主动改为320*240

OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

彩色图

OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

未配准时的深度图

OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

配准到彩色图后的深度图

OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFzaWJ1YWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

深度图配准到彩色图后的1:1融合图

OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

彩色图配准到深度图后的1:1融合图

OpenNI中提供4中数据流异步机制:

(1) WaitNoneUpdateAll():不等待流的更新,这样有可能读出来的和上次是同一帧

(2) WaitAndUpdateAll():等待深度和彩色流都更新

(3) WaitAnyUpdateAll():随意流有更新则返回

(4) WaitOneUpdateAll(ProductionNode &node):等待參数指定的流更新

代码:

#include <stdlib.h>
#include <iostream>
#include <string> //OpenCV c函数头文件
#include "opencv/cv.h"
#include "opencv/highgui.h" //OpenCV c++函数头文件
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp> #include <XnCppWrapper.h> //OpenNI的头文件 using namespace std;
using namespace cv;
using namespace xn; // OpenNI的命名空间 int main()
{
XnStatus result = XN_STATUS_OK; //OpenNI函数的返回结果
DepthMetaData depthMD; //OpenNI深度数据
ImageMetaData imageMD; //OpenNI彩色数据 //c版本号OpenCV
//IplImage* 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); //c++版本号OpenCV
Mat cvDepthImg, cvBGRImg, cvFusionImg;
namedWindow("depth");
namedWindow("RGB");
namedWindow("fusion"); // 创建并初始化设备上下文
Context context;
result = context.Init();
if (XN_STATUS_OK != result)
cerr<<"设备上下文初始化错误"<<endl; // 创建深度生成器和彩色生成器
DepthGenerator depthGenerator;
result = depthGenerator.Create( context );
if (XN_STATUS_OK != result)
cerr<<"创建深度生成器错误"<<endl;
ImageGenerator imageGenerator;
result = imageGenerator.Create( context );
if (XN_STATUS_OK != result)
cerr<<"创建彩色生成器错误"<<endl; //通过映射模式来设置生成器參数,如分辨率、帧率
XnMapOutputMode mapMode;
mapMode.nXRes = 640;
mapMode.nYRes = 480;
mapMode.nFPS = 30;
result = depthGenerator.SetMapOutputMode( mapMode );
result = imageGenerator.SetMapOutputMode( mapMode ); // 将深度生成器的视角对齐到彩色生成器,将深度数据配准到彩色数据
depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator );
//imageGenerator.GetAlternativeViewPointCap().SetViewPoint(depthGenerator); //彩色图配准到深度图 // 启动全部生成器,即启动数据流
result = context.StartGeneratingAll();
while( true)
{
// 更新数据
result = context.WaitNoneUpdateAll();
if (XN_STATUS_OK == result)
{
//获取一帧深度图并转换为OpenCV中的图像格式
depthGenerator.GetMetaData(depthMD);
Mat cvRawImg16U(depthMD.FullYRes(), depthMD.FullXRes(), CV_16UC1, (char *)depthMD.Data() );
cvRawImg16U.convertTo(cvDepthImg, CV_8U, 255.0/(depthMD.ZRes()));
imshow("depth", cvDepthImg); //获取一帧彩色图并转换为OpenCV中的图像格式
imageGenerator.GetMetaData(imageMD);
Mat cvRGBImg(imageMD.FullYRes(), imageMD.FullXRes(), CV_8UC3, (char *)imageMD.Data());
cvtColor(cvRGBImg, cvBGRImg, CV_RGB2BGR);
imshow("RGB", cvBGRImg); //融合图
cvtColor(cvDepthImg,cvFusionImg,CV_GRAY2BGR);
addWeighted(cvBGRImg, 0.5, cvFusionImg, 0.5, 0, cvFusionImg);
imshow("fusion", cvFusionImg);
waitKey(30); //没有waitKey不显示图像 // c函数形式
//memcpy(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);
}
} context.StopGeneratingAll(); //停止数据流
context.Shutdown(); //关闭设备上下文
destroyWindow("depth");
destroyWindow("RGB");
destroyWindow("fusion"); //cvDestroyWindow("depth");
//cvDestroyWindow("image");
//cvReleaseImage(&imgDepth16u);
//cvReleaseImage(&imgRGB8u);
//cvReleaseImage(&depthShow);
//cvReleaseImage(&imageShow); return 0;
}

环境配置:

华硕XtionProLive,Win7 32位系统,VS2010,OpenCV2.4.4,OpenNI1.5.2.23

源代码下载:

http://download.csdn.net/detail/masikkk/7581283

OpenNI1.5 + NITE + Sensor下载:

http://download.csdn.net/detail/masikkk/7581339

參考:

Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像)

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

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

OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示的更多相关文章

  1. OpenNI2获取华硕XtionProLive深度图和彩色图并用OpenCV显示

    使用OpenNI2打开XtionProLive时有个问题,彩色图分辨率不管怎样设置始终是320*240,深度图倒是能够设成640*480,而OpenNI1.x是能够获取640*480的彩色图的. 彩色 ...

  2. Kinect SDK&lpar;1&rpar;:读取彩色、深度、骨骼信息并用OpenCV显示

    Kinect SDK 读取彩色.深度.骨骼信息并用OpenCV显示 一.原理说明 对于原理相信大家都明白大致的情况,因此,在此只说比较特别的部分. 1.1 深度流数据: 深度数据流所提供的图像帧中,每 ...

  3. kinect 深度图与彩色图对齐程序

    //#include "duiqi.hpp" #include "kinect.h" #include <iostream> #include &q ...

  4. Android-将RGB彩色图转换为灰度图

    package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...

  5. Kinect for Windows V2和V1对照开发&lowbar;&lowbar;&lowbar;彩色数据获取并用OpenCV2&period;4&period;10显示

    V1彩色分辨率:640x480 V2彩色分辨率:1920x1080 1,打开彩色图像帧的方式 对于V1: 使用NuiImageStreamOpen方法打开 hr = m_PNuiSensor-> ...

  6. 什么?Iconfont终于可以支持彩色图标了

    如果你对iconfont有所了解,那你一定对这次iconfont做出的更新产生兴趣.没错,iconfont目前已经升级为iconfont+,并且能够支持大家都很期待的彩色图标. 之前,大家也以文字的形 ...

  7. jquery 获取 json文件内容后,将其内容显示到 下拉列表框中,再将下拉列表中的内容,显示到文本框中

    <script type="text/javascript"> $(function(){ $("#huoqv").click(function() ...

  8. QT 实现彩色图亮度均衡,RGB和HSI空间互相转换

    从昨天折腾到今天.再折腾下去我都要上主楼了  大致和灰度图均衡是一样的,主要是不能像平滑什么的直接对R,G,B三个分量进行.这样出来的图像时没法看的.因此我们要对亮度进行均衡.而HSI彩色空间中的分量 ...

  9. 获取本地的jvm信息&comma;进行图形化展示

    package test1; import java.lang.management.CompilationMXBean; import java.lang.management.GarbageCol ...

随机推荐

  1. css 隔行变色,表单布局

    隔行变色: #list1 li:nth-of-type(odd){ background:#00ccff;}奇数行  #list1 li:nth-of-type(even){ background:# ...

  2. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  3. MongoDB replication set副本集(主从复制)(8)(转)

    转载地址:http://www.cnblogs.com/huangxincheng/p/4870557.html replicattion set 就是多台服务器维护相同的数据副本,提高服务器的可用性 ...

  4. address&lowbar;add

    <include file="Header:header-address_add" /> <include file="Header:header-pu ...

  5. PHP抓取豆瓣读书爬虫代码

    <?php//演示地址 http://asizu.sinaapp.com/reptile_douban.php//数据量不是特别大,没有写抓完数据便停止. 喜欢的朋友拿去自己改改就好了 head ...

  6. java调优随记-堆和栈

    基础知识: 关于堆和栈,堆和栈是程序运行的关键,关于堆和栈的定义和解释可自行搜索,我比较认可以程序运行过程中他们扮演的角色作为对比的点:堆是存储的单位,而栈是程序运行时的单位.栈解决的是程序的运行问题 ...

  7. Codeforces Round &num;246 &lpar;Div&period; 2&rpar;

    题目链接:Codeforces Round #246 (Div. 2) A:直接找满足的人数,然后整除3就是答案 B:开一个vis数组记录每一个衣服的主场和客场出现次数.然后输出的时候主场数量加上反复 ...

  8. 历年noip复赛试题整合

    早晨打算把历年的试题都过一遍,整理一下大概会往哪个方向考,考什么,不说太多,开始吧 2013: Day1: T1 转圈游戏 : 快速幂(关键在于要会打 快速幂) 思路:因为每次都进m位,相当于每次x加 ...

  9. UILabel的抗压缩、抗拉伸、以及控件的约束简述

    今天来说一说UILabel的约束设置问题 首先主要介绍:Priority(控件约束的优先级).Content Hugging Priority(控件抗拉伸优先级).Content Compressio ...

  10. Python开发【内置模块篇】datetime

    获取当前日期和时间 >>> from datetime import datetime >>> now = datetime.now() >>> ...