開始之前,讓我們自己開始再熟練熟練openni 2的基本使用,主要包括以下幾個步驟:
1. 初始化openni環境: openni::openni::initialize();
2. 宣告並開啟device裝置: openni::device devanydevice; devanydevice.open( openni::any_device );
3. 建立並開啟深度資料流:openni::videostream streamdepth; streamdepth.create( devanydevice, openni::sensor_depth ); streamdepth.start();
4. 讀取資料流資訊並儲存在videoframeref中:openni::videoframeref framedepth;streamdepth.readframe( &framedepth );
5. 獲取深度(或顏色等)資料,開始我們自己的開發之旅: const openni::depthpixel* pdepth = (const openni::depthpixel*)framedepth.getdata();
6. 當結束使用資料時,首先關閉、銷毀資料流:streamdepth.destroy();
7. 接著關閉裝置: devanydevice.close();
8. 最後關閉openni: openni::openni::shutdown();
具體**如下(環境配置在之前的博文中提及了,這裡省去)
#include #include "openni.h"
int main( int argc, char** ar** )
// 關閉資料流
streamdepth.destroy();
streamcolor.destroy();
// 關閉裝置
devanydevice.close();
// 最後關閉openni
openni::openni::shutdown();
return 0;
}但我們使用openni和kinect更多的是為了研究開發之用,其中用到最多的是opencv(opengl、qt也很多,只是本人用的最多的是opencv),下面就結合openni 2和opencv 2.4.3開始我的第乙個程式:利用opencv函式顯示深度影象和彩色影象。直接上**:
// yeopenni2******usingopencv.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include "openni.h"
// 載入opencv標頭檔案
#include "opencv2/opencv.hpp"
#include #include #include using namespace std;
using namespace openni;
using namespace cv;
int main( int argc, char** ar** )
// 開啟深度和影象資料流
streamdepth.start();
streamcolor.start();
// 建立opencv影象視窗
namedwindow( "depth image", cv_window_autosize );
namedwindow( "color image", cv_window_autosize );
// 獲得最大深度值
int imaxdepth = streamdepth.getmaxpixelvalue();
// 迴圈讀取資料流資訊並儲存在videoframeref中
videoframeref framedepth;
videoframeref framecolor;
while( true )
// 關閉資料流
streamdepth.destroy();
streamcolor.destroy();
// 關閉裝置
devanydevice.close();
// 最後關閉openni
openni::openni::shutdown();
return 0;
}
顯示效果圖:
這個是在原有的程式上做了新增,主要新增了:
enum pixelformat
主要分成兩類:深度畫素格式和彩色影象格式。具體是什麼含義,我想利用opencv常用影象格式知識,自己多嘗試使用對照,發現它們的不同之處和特別之處。
enum imageregistrationmode
3. 讀取深度影象資訊和彩色影象資訊,然後相應的轉換為opencv格式,並顯示:
// 讀取資料流
streamdepth.readframe( &framedepth );
streamcolor.readframe( &framecolor );
// 將深度資料轉換成opencv格式
const cv::mat mimagedepth( framedepth.getheight(), framedepth.getwidth(), cv_16uc1, (void*)framedepth.getdata());
// 為了讓深度影象顯示的更加明顯一些,將cv_16uc1 ==> cv_8u格式
cv::mat mscaleddepth;
mimagedepth.convertto( mscaleddepth, cv_8u, 255.0 / imaxdepth );
// 顯示出深度影象
cv::imshow( "depth image", mscaleddepth );
// 同樣的將彩色影象資料轉化成opencv格式
const cv::mat mimagergb(framecolor.getheight(), framecolor.getwidth(), cv_8uc3, (void*)framecolor.getdata());
// 首先將rgb格式轉換為bgr格式
cv::mat cimagebgr;
cv::cvtcolor( mimagergb, cimagebgr, cv_rgb2bgr );
// 然後顯示彩色影象
cv::imshow( "color image", cimagebgr );
這個主要就是opencv的影象格式和顯示有關的知識了,此處省去n個字。。。
總結:知道了如何獲取深度和彩色影象資訊+opencv常用影象轉換函式和影象格式,我想這個程式就很好寫,並且很明了易懂了。
openni2結構簡介
openni框架是一套開源的sdk,用於開發3d感測器的中間層和應用層。各個感測器需要實現onidriverapi.h中定義的介面,具體實現在openni2 source drivers目錄下,不同感測器編譯成不同的動態庫。openni initialize 用於載入各個感測器的動態庫,並獲得動態庫...
談談OpenNI 2初體驗
十 一 談談nite 2手部跟蹤在彩色影象上的顯示 在談談nite 2與opencv結合的第乙個程式和談談nite 2與opencv結合的第乙個程式中我們都是在深度影象中對獲得的手部資訊進行處理,但不知道在彩色影象中,手部跟蹤獲得手心座標是怎麼樣的?是否也和深度影象顯示一樣,能夠很好的定位到真正的手...
關於hibernate和struts2結合的用法
關於乙個完整資料傳輸過程,即資料從頁面通過三層傳到資料庫,或者資料從資料庫通過三層傳到頁面,目前我使用了 兩個框架,這裡我做個總結。hibernate 相對於struts2,hibernate還是比較容易理解,即改變service層和dao層的結構,service層變化不大,主要是把sql改變成hq...