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

彩色图

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

配准到彩色图后的深度图

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

1:1融合图

代码:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream> #include "OpenNI.h" using namespace openni;
using namespace cv;
using namespace std; int main()
{
Status rc = STATUS_OK; // OpenNI函数运行结果 //OpenNI2图
VideoFrameRef oniDepthImg, oniColorImg; //OpenCV图
Mat cvDepthImg, cvBGRImg, cvFusionImg; //初始化OpenNI2
rc = OpenNI::initialize(); //打开Kinect或Xtion设备
Device device;
const char * deviceURL = openni::ANY_DEVICE; //设备名
rc = device.open(deviceURL); //创建并打开深度数据流
VideoStream oniDepthStream; //深度数据流
rc = oniDepthStream.create(device, SENSOR_DEPTH); //创建深度数据流
if( STATUS_OK == rc )
{
//设置深度视频模式
VideoMode modeDepth;
modeDepth.setResolution(320,240/*640,480*/); //分辨率
modeDepth.setFps(30); //帧率
modeDepth.setPixelFormat(PIXEL_FORMAT_DEPTH_1_MM); //深度像素格式
oniDepthStream.setVideoMode(modeDepth); oniDepthStream.start(); // 打开深度数据流
if(STATUS_OK != rc)
{
cerr << "无法打开深度数据流:"<<OpenNI::getExtendedError()<<endl;
oniDepthStream.destroy();
}
}
else
{
cerr << "无法创建深度数据流:"<<OpenNI::getExtendedError()<<endl;
} //创建并打开彩色数据流
VideoStream oniColorStream; //RGB数据流
rc = oniColorStream.create(device, SENSOR_COLOR);
if(STATUS_OK == rc)
{
//设置彩色视频模式
VideoMode modeColor;
//不知道为什么,彩色图的分辨率不管怎样设置始终都是320*240
modeColor.setResolution(320,240/*1280,1040*/);//分辨率
modeColor.setFps(30);//帧率
modeColor.setPixelFormat(PIXEL_FORMAT_RGB888); //设置深度图和彩色图的配准模式
if(device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR))
{
device.setImageRegistrationMode(IMAGE_REGISTRATION_DEPTH_TO_COLOR); //深度到彩色图配准
} rc = oniColorStream.start(); //打开彩色数据流
if( STATUS_OK != rc )
{
cerr<< "无法打开彩色数据流:"<<OpenNI::getExtendedError()<<endl;
oniColorStream.destroy();
}
}
else
{
cerr << "无法创建彩色数据流:"<<OpenNI::getExtendedError()<<endl;
} if (!oniDepthStream.isValid() || !oniColorStream.isValid())
{
cerr << "彩色或深度数据流不合法"<<endl;
OpenNI::shutdown();
return 1;
} namedWindow("depth");
namedWindow("RGB");
namedWindow("fusion"); while(true)
{
//读取一帧深度图
if( STATUS_OK == oniDepthStream.readFrame(&oniDepthImg) )
{
Mat cvRawImg16U(oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData());
cvRawImg16U.convertTo(cvDepthImg, CV_8U, 255.0/(oniDepthStream.getMaxPixelValue()));
flip(cvDepthImg,cvDepthImg,1);//水平翻转
imshow("depth", cvDepthImg);
} //读取一帧彩色图
if( STATUS_OK == oniColorStream.readFrame(&oniColorImg) )
{
Mat cvRGBImg(oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData());
cvtColor(cvRGBImg, cvBGRImg, CV_RGB2BGR);
flip(cvBGRImg,cvBGRImg,1);//水平翻转
imshow("RGB", cvBGRImg);
} //融合图
cvtColor(cvDepthImg,cvFusionImg,CV_GRAY2BGR);
addWeighted(cvBGRImg, 0.5, cvFusionImg, 0.5, 0, cvFusionImg);
flip(cvFusionImg,cvFusionImg,1);//水平翻转
imshow("fusion", cvFusionImg); waitKey(30);//没有waitKey不显示图像
} destroyWindow("depth");
destroyWindow("RGB");
destroyWindow("fusion"); oniDepthStream.destroy();
oniColorStream.destroy();
device.close();
OpenNI::shutdown(); return 0;
}

环境:

XtionProLive。Win7 32位。VS2010,OpenNI2.1.0,OpenCV2.4.4

源代码下载:

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

OpenNI2.1下载:

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

參考:

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

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

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


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

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

    华硕XtionPro类似Kinect,都是体感摄像机,可捕捉深度图和彩色图. 具体參数见:http://www.asus.com.cn/Multimedia/Xtion_PRO_LIVE/specif ...

  2. Kinect SDK(1):读取彩色、深度、骨骼信息并用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. ECharts图表插件(4.x版本)使用(一、关系图force节点显示为自定义图像/图片,带分类选择)

    导读 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safar ...

  6. 遭遇input与button按钮背景图失效不显示的解决办法

    笔者从事网页前端代码页面工程师已有多年,作为一个网页重构人员常常会遇到一些莫名其妙的DIV+CSS(正确的说法是XHTML+CSS)在 IE.FireFox火狐. 谷歌浏览器CHROME.苹果浏览器S ...

  7. input与button按钮背景图失效不显示的解决办法

    今天做公司的某个网站前端网页页面的时候笔者又遇到了难解决的网页前端DIVCSS代码问题,一个平时不会发生的怪事情发生了:为网页代码中的Form表单中的input 和 button 按钮标签在CSS样式 ...

  8. Kinect for Windows V2和V1对照开发___彩色数据获取并用OpenCV2.4.10显示

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

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

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

随机推荐

  1. VTK的安装配置-使用VS2010

    1.CMake的安装 CMake安装是用来对VTK编译前的配置工作.此博客中使用的是CMake2.8.CMake的下载可到https://cmake.org/站点上进行下载. 2.VTK源代码 VTK ...

  2. HBase 数据库检索性能优化策略

    HBase 数据表介绍 HBase 数据库是一个基于分布式的.面向列的.主要用于非结构化数据存储用途的开源数据库.其设计思路来源于 Google 的非开源数据库"BigTable" ...

  3. jquery05 继承

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  4. POJ 2391 Floyd+二分+拆点最大流

    题意: 思路: 先Floyd一遍两两点之间的最短路 二分答案 建图 跑Dinic 只要不像我一样作死#define int long long 估计都没啥事-- 我T到死辣--.. 最后才改过来-- ...

  5. idea git ignore 插件

    https://blog.csdn.net/qq_34590097/article/details/56284935

  6. TCP/IP图解学习总结(二)

    注意:这里的第n层是依照OSI协议来的 I   网桥--2层交换机.数据链路层面上链接两个网络的设备.它可以识别数据链路层中的数据帧. II  路由器-3层交换机.网络层面上连接两个网络,并对分组报文 ...

  7. theme- 工作原理

    首先看一下theme中的设置,代码如下 <?xml version="1.0" encoding="utf-8"?> <resources&g ...

  8. javascript创建对象的方法--基本模式

    javascript创建对象的方法--基本模式 一.总结 关注本质 二.代码 <!DOCTYPE html> <html lang="zh-cn"> < ...

  9. Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes(inputString);区别

    Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes( ...

  10. SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...