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顯示
相關文章
- OpenNI2獲取華碩XtionProLive深度圖和彩色圖並用OpenCV顯示OpenCV
- 用Qt5和OpenCV讀取顯示中文路徑的圖片QTOpenCV
- opencv圖片上如何顯示兩個小圖片OpenCV
- 如何不顯示地圖就獲取位置資料?地圖
- PHP獲取網站標題和圖示PHP網站
- 慢動作輸出 Linux 命令結果並用彩色顯示Linux
- Mac小技巧:怎麼才能獲取應用圖示Mac
- 使用Hibernate和Struts向資料庫中儲存、讀取並顯示圖片資料庫
- Excel 讀取圖片並獲取儲存路徑Excel
- 利用API獲取金融資料並畫圖API
- win10 無法獲取圖示怎麼解決 win10系統圖示不能正常顯示怎麼辦Win10
- 顯示地圖地圖
- QLabel顯示圖片 ,並實現縮放
- 獲取手機上 APP 或者 APK 圖示APPAPK
- 用JavaScript獲取原始圖片尺寸JavaScript
- win7圖片只顯示圖示不顯示預覽圖解決方案Win7圖解
- win10 如何設定微信顯示通知和圖示 win10怎麼顯示微信圖示Win10
- opencv顯示中文OpenCV
- Android用ImageView顯示本地和網上的圖片AndroidView
- Java——獲取圖片尺寸和大小Java
- Python基於opencv呼叫攝像頭獲取個人圖片PythonOpenCV
- vue自定義指令擷取圖片中心顯示Vue
- qt 使用qmake pro檔案新增 ico圖示,程式執行時顯示圖示,exe也顯示圖示QT
- Android開發獲取相機拍照的原圖(並非縮圖)Android
- find和ls並用,查詢檔案並顯示大小 .
- Activity背景顯示app圖示APP
- [linux]在vi和vim中彩色顯示語法Linux
- vue 滑鼠移入顯示圖示 ,滑鼠移出隱藏圖示Vue
- img圖片無法顯示利用onerror事件顯示替代圖片Error事件
- mac 文件顯示圖示和軟體圖示不一致 解決方案Mac
- 【Qt開發】更改應用程式圖示和工作列圖示QT
- Django實現圖片上傳並前端頁面顯示Django前端
- 瀏覽器更新HTTP伺服器圖片並顯示瀏覽器HTTP伺服器
- AXIOS從伺服器載入圖片並顯示iOS伺服器
- 第四章 載入並顯示PNG圖片
- Android圖片處理:識別影象方向並顯示Android
- 高德地圖,只有部分marker顯示InfoWindow並可點選地圖
- MATLAB學習之gif圖片讀取顯示Matlab