標籤:openni xtionpro
華碩XtionPro類似Kinect,都是體感攝像機,可捕捉深度圖和彩色圖,
詳細參數見:http://www.asus.com.cn/Multimedia/Xtion_PRO_LIVE/specifications/
實驗設定的深度圖和彩色圖大小都是640*480,如下:
彩色圖
未配準時的深度圖
配准到彩色圖後的深度圖
深度圖配准到彩色圖後的1:1融合圖
彩色圖配准到深度圖後的1:1融合圖
代碼:
#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++版本OpenCVMat 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讀取深度映像與彩色映像並顯示