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

使用OpenNI2打开XtionProLive时有个问题,彩色图分辨率无论如何设置始终是320*240,深度图倒是可以设成640*480,而OpenNI1.x是可以获取640*480的彩色图的。

彩色图

配准到彩色图后的深度图

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显示,布布扣,bubuko.com

时间: 2024-10-07 15:41:18

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

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

华硕XtionPro类似Kinect,都是体感摄像机,可捕捉深度图和彩色图, 详细参数见:http://www.asus.com.cn/Multimedia/Xtion_PRO_LIVE/specifications/ 实验设定的深度图和彩色图大小都是640*480,如下: 彩色图 未配准时的深度图 配准到彩色图后的深度图 深度图配准到彩色图后的1:1融合图 彩色图配准到深度图后的1:1融合图 代码: #include <stdlib.h> #include <iostream>

彩色图到灰度图究竟是怎么变换的

??之前对彩色图与灰度图仅仅停留在前者是3通道后者是单通道的理解上.我也知道计算机看图片是将它们当成数组,但是一直搞不清楚将一张彩色图转变为灰度图是怎么操作的.当然,很多库函数都提供借口,包括OpenCV.PIL等.这里我参考https://blog.csdn.net/saltriver/article/details/79677116 手动实现将一张彩色图转换为灰色图.当然还是以帅气的哈士奇.jpg作为我的练习对象,看到它敲代码都有动力. from PIL import Image impor

灰度图转彩色图(伪彩色处理)

将8Bit灰度数据转化为Bgr24的彩色图像 8bit灰度数据:byte[] GrayValue    长度:width * height PixelFormat pixelFormat = PixelFormats.Bgr24; byte[] colorvalues = GrayToColor(GrayValue); ByteSize = Width * Height; IntPtr dataPtr = IntPtr.Zero; GCHandle _hObject = GCHandle.All

彩色图转化成灰度图

对于图像由彩色图转化为灰度图有三种方法分别为 加权法 均值法 最大值法! 加权法就是  GRAY==0.3*R+0.59*G+0.11*B 均值法就是 GRAY==(R+G+B)/3 最大值发就是  max(R,G,B) A=imread('D:\lena.BMP');r=double(A(:,:,1));g=double(A(:,:,2));b=double(A(:,:,3));[m,n]=size(r);bw=zeros(m,n);bw=0.3.*r+0.59.*g+0.11.*b;subp

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

V1彩色分辨率:640x480 V2彩色分辨率:1920x1080 1,打开彩色图像帧的方式 对于V1: 使用NuiImageStreamOpen方法打开 hr = m_PNuiSensor->NuiImageStreamOpen( NUI_IMAGE_TYPE_COLOR,NUI_IMAGE_RESOLUTION_640x480,0, 2, m_hNextColorFrameEvent,&m_hColorStreamHandle); if( FAILED( hr ) ) { cout<

80*25彩色字模式的显示显存示例

1 ; 80*25彩色字模式的显示显存在内存中的地址为B8000h~BFFFH,共32k.向这个地址写入的内容立即显示在 屏幕上边. 2 3 ;在80*25彩色字模式 下共可以显示25行,每行80字符,每个字符在显存中占两个字节,第一个字节是字符的ASCII码.第二字节是字符的属性,(80字符占160个字节) 4 5 ;DispReturn模拟一个回车的显示,(让下一个要显示的字符在下一行的开头处显示),其中edi始终指向要显示的下一个字符的位置. 6 ; -------------------

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

笔者从事网页前端代码页面工程师已有多年,作为一个网页重构人员常常会遇到一些莫名其妙的DIV+CSS(正确的说法是XHTML+CSS)在 IE.FireFox火狐. 谷歌浏览器CHROME.苹果浏览器Safari.Opera下不兼容的问题,其中IE6最为棘手,历来IE6就被诸位前端代码人员所诅咒,无奈其用户在 中国大陆又非常多!可恶的微软啊,你当年造IE6的时候为何不严格遵守W3C标准呢? 今天做公司的交友网站前端网页页面的时候笔者又遇到了难解决的网页前端DIVCSS代码问题,一个平时不会发生的怪

后台获取的图片位置不对时的默认图片显示

img先设置一个占位符,用来存放后台返回的图片地址,如果图片存在且地址正确则替换掉当前图片,如果后台获取的图片地址不正确,则还显示默认图片,这里提供onerror进行控制: <img src="../images/default_male.png" alt="店铺icon" id="store-img" class="store-logo" onerror="javascript:this.src='../im

Java 彩色图转灰度图

1. 方法1 BufferedImage grayImage = new BufferedImage(width, height, colorImage.TYPE_BYTE_GRAY); Graphics g = grayImage.getGraphics(); g.drawImage(colorImage, 0, 0, null); g.dispose(); 2. 方法2(不推荐) ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRA