OpenNI2获取华硕XtionProLive深度图和彩色图并用OpenCV显示
使用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显示的更多相关文章
- OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示
华硕XtionPro类似Kinect,都是体感摄像机,可捕捉深度图和彩色图. 具体參数见:http://www.asus.com.cn/Multimedia/Xtion_PRO_LIVE/specif ...
- Kinect SDK(1):读取彩色、深度、骨骼信息并用OpenCV显示
Kinect SDK 读取彩色.深度.骨骼信息并用OpenCV显示 一.原理说明 对于原理相信大家都明白大致的情况,因此,在此只说比较特别的部分. 1.1 深度流数据: 深度数据流所提供的图像帧中,每 ...
- kinect 深度图与彩色图对齐程序
//#include "duiqi.hpp" #include "kinect.h" #include <iostream> #include &q ...
- Android-将RGB彩色图转换为灰度图
package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...
- ECharts图表插件(4.x版本)使用(一、关系图force节点显示为自定义图像/图片,带分类选择)
导读 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safar ...
- 遭遇input与button按钮背景图失效不显示的解决办法
笔者从事网页前端代码页面工程师已有多年,作为一个网页重构人员常常会遇到一些莫名其妙的DIV+CSS(正确的说法是XHTML+CSS)在 IE.FireFox火狐. 谷歌浏览器CHROME.苹果浏览器S ...
- input与button按钮背景图失效不显示的解决办法
今天做公司的某个网站前端网页页面的时候笔者又遇到了难解决的网页前端DIVCSS代码问题,一个平时不会发生的怪事情发生了:为网页代码中的Form表单中的input 和 button 按钮标签在CSS样式 ...
- Kinect for Windows V2和V1对照开发___彩色数据获取并用OpenCV2.4.10显示
V1彩色分辨率:640x480 V2彩色分辨率:1920x1080 1,打开彩色图像帧的方式 对于V1: 使用NuiImageStreamOpen方法打开 hr = m_PNuiSensor-> ...
- QT 实现彩色图亮度均衡,RGB和HSI空间互相转换
从昨天折腾到今天.再折腾下去我都要上主楼了 大致和灰度图均衡是一样的,主要是不能像平滑什么的直接对R,G,B三个分量进行.这样出来的图像时没法看的.因此我们要对亮度进行均衡.而HSI彩色空间中的分量 ...
随机推荐
- 測试password强度
<html> <!--激情在最后面.请看最后面红色字 这是是个计算password强度的实例 网上有非常多这种样例 只是呢,都不怎么好 这是我写的一个完整的效果,能够通用, new一 ...
- vue2留言板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- javafx mouseEvent
public class EffectTest extends Application { Path path; @Override public void start(Stage primarySt ...
- gpasswd---指定要管理的工作组,及更改密码
gpasswd 命令详解 gpasswd命令是Linux下工作组文件/etc/group和/etc/gshadow的管理工具,用于指定要管理的工作组. 2.选项详解: -a : 添加用户到组 -d : ...
- 01-Jvm 内存区域复习笔记
Java内存区域 1.程序计数器(Program Counter Register) 在虚拟机中一块较小的内存空间.它的作用能够看做是当前线程所运行的字节码的行号指示 ...
- 华为PUSH SDK 接入方法
本文参考了华为推送平台官网及其Demo:http://developer.huawei.com/cn/consumer/wiki/index.php?title=%E6%8E%A5%E5%85%A5% ...
- Android 打造属于自己的RxBus
RxBus 通过RxJava实现Rxbus. 相信大家已经非常熟悉EventBus了.最近正在学习Rxjava,如果在项目中已经使用了Rxjava,使用RxBus来代替EventBus应该是不错的选择 ...
- canvas和svg区别
什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...
- Method of address space layout randomization for windows operating systems
A system and method for address space layout randomization ("ASLR") for a Windows operatin ...
- Arch Linux实体机安装记录
下面将记录笔者在戴尔笔记本安装arch linux的过程,用于记录,以便下次使用. 本文的内容参考arch linux官方Wiki. 首先,使用Power ISO把镜像安装到U盘,使用U盘安装. 通过 ...