zoukankan      html  css  js  c++  java
  • OpenNI1.5获取华硕XtionProLive深度图和彩色图并用OpenCV显示

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

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


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



    彩色图



    未配准时的深度图



    配准到彩色图后的深度图



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



    彩色图配准到深度图后的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显示


  • 相关阅读:
    asp.net Core 中间件Hello world
    MVC2 ,MVC3 ,MVC4,MVC5的区别,EF的各个版本的区别;LocalDB是个啥
    EF6 MVC5译文
    发布一个C++版本的ORM库SmartDB
    ORM
    Git图形化界面客户端大汇总
    Model工具
    HTTP协议的8种请求类型介绍
    五大主流数据库模型
    店铺装修——进阶模块介绍
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7402910.html
Copyright © 2011-2022 走看看