a5_OpenNI 进阶初始化


http://kheresy.wordpress.com/ 顧正偉/Heresy http://kheresy.wordpress.com/ 國家高速網路與計算中心 科學視算與互動媒體實驗室 http://viml.nchc.org.tw/ OpenNI 進階初始化 http://kheresy.wordpress.com/ 目錄 • 錄製與重播 • 限制建立 Production Node 的條件 • 使用 XML 檔進行初始化 • 程式上的修改 • XML 的定義 http://kheresy.wordpress.com/ 錄製與重播 http://kheresy.wordpress.com/ OpenNI 的錄製、重播功能 • 使用 • xn::Recorder • xn::Player • 可以用來錄製 depth generator、image generator 等原始資料、並拿來重新使用 • OpenNI 自定義的 ONI 格式 • 支援壓縮 • 適合拿來當記錄測試資料、進行除錯 http://kheresy.wordpress.com/ 錄製 • 當呼叫 Context 的 WaitAndUpdateAll() 或 Recoder 的 Record() 時,就會記 錄當時的 資料 • Codec •XN_CODEC_UNCOMPRESSED •XN_CODEC_JPEG • XN_CODEC_16Z, XN_CODEC_8Z • XN_CODEC_16Z_EMB_TABLES // create recorder xn::Recorder xRecorder; xRecorder.Create( xContext ); xRecorder.SetDestination( XN_RECORD_MEDIUM_FILE,"TEST.ONI" ); xRecorder.AddNodeToRecording( xImageGen, XN_CODEC_JPEG ); xRecorder.AddNodeToRecording( xDepthGen, XN_CODEC_16Z_EMB_TABLES ); http://kheresy.wordpress.com/ Example 09_Record http://kheresy.wordpress.com/ 重播 • 初始化 context 後、建立 player node • 透過 OpenFileRecording() 開啟 ONI 檔 • 之後的流程完全相同 • 會建立所謂的 mock nodes 來產生資料 •// 1. initial context xn::Context xContext; xContext.Init(); •// 2. Create Player xn::Player xPlayer; xContext.OpenFileRecording( "skeletonrec.oni", xPlayer ); http://kheresy.wordpress.com/ Xn::Player 的額外功能 • 播放速度控制 • SetPlaybackSpeed( XnDouble dSpeed ) • 到特定時間 • SeekToTimeStamp( XnInt64 nTimeOffset, XnPlayerSeekOrigin) • SeekToFrame( const XnChar *strNodeName, XnInt32 nFrameOffset, XnPlayerSeekOrigin ) • 重複播放 • SetRepeat( XnBool bRepeat ) •… http://kheresy.wordpress.com/ 限制建立 Production Node 的條件 http://kheresy.wordpress.com/ 限制 Production Node 的條件 • OpenNI 有提供 xn::Query,可以用來作為 Production Node 的限制條件 • SetVendor(const XnChar *strVendor) • SetName(const XnChar *strName) • SetMinVersion(const XnVersion &minVersion) • SetMaxVersion(const XnVersion &maxVersion) • AddSupportedCapability(const XnChar *strNeededCapability) • AddSupportedMapOutputMode(const XnMapOutputMode &MapOutputMode) • SetSupportedMinUserPositions(const XnUInt32 nCount) • SetExistingNodeOnly(XnBool bExistingNode) • AddNeededNode(const XnChar *strInstanceName) • SetCreationInfo(const XnChar *strCreationInfo) http://kheresy.wordpress.com/ 使用搜尋條件建立 Production Node • Production Node • Create( Context& context, Query* pQuery = NULL, EnumerationErrors* pErrors = NULL ) • Context • CreateAnyProductionTree( XnProductionNodeType type, Query* pQuery, ProductionNode& node, EnumerationErrors* pErrors ) http://kheresy.wordpress.com/ 範例 • 設定條件 • 建立 production node xn::Query xQuery; xQuery.AddSupportedCapability( XN_CAPABILITY_MIRROR ); XnMapOutputMode xMode; xMode.nXRes = 640; xMode.nYRes = 480; xMode.nFPS = 30; xQuery.AddSupportedMapOutputMode( xMode ); g_xContext.CreateAnyProductionTree( XN_NODE_TYPE_DEPTH,&xQuery, g_xDepthGen ); g_xDepthGen.Create( g_xContext, &xQuery ); http://kheresy.wordpress.com/ 列舉符合條件的 Production Node • Context • EnumerateProductionTrees( XnProductionNodeType Type, const Query* pQuery, NodeInfoList& TreesList, EnumerationErrors* pErrors ) • 會把符合的結果儲存在 NodeInfoList 內,不會建立出來 http://kheresy.wordpress.com/ 範例 xn::NodeInfoList xNodeList; g_xContext.EnumerateProductionTrees( XN_NODE_TYPE_DEPTH,&xQuery, xNodeList ); for( xn::NodeInfoList::Iterator itNode = xNodeList.Begin(); itNode != xNodeList.End(); ++ itNode ) { // Get Node xn::NodeInfo xNodeInf = *itNode; // get node description XnProductionNodeDescription desc = xNodeInf.GetDescription(); } http://kheresy.wordpress.com/ 根據 Node Info 建立 Production Node xn::NodeInfoList xNodeList; g_xContext.EnumerateProductionTrees( XN_NODE_TYPE_DEVICE, NULL, xNodeList ); std::vector vDevice; for( xn::NodeInfoList::Iterator itNode = xNodeList.Begin(); itNode != xNodeList.End(); ++ itNode ) { // Get Node xn::NodeInfo xNodeInf = *itNode; // Create node vDevice.push_back( xn::Device() ); g_xContext.CreateProductionTree( xNodeInf, *vDevice.rbegin() ); } http://kheresy.wordpress.com/ 使用 XML 檔進行初始化 http://kheresy.wordpress.com/ 使用 XML 檔進行初始化 • OpenNI 有定義 XML 腳本檔案,可以用來做 OpenNI 環境的設定 • 加入授權(License) • 紀錄資訊(log) • 設定要建立那些 Production node • 根據條件進行 node 的建立 • 進行各種設定 • 優點: • 可以不需要修改程式,就針對 OpenNI 的 Production Node 作設定上的修改 • 例如:決定是否要鏡射、對於 node 的使用的限制 http://kheresy.wordpress.com/ 程式上的修改 • 使用 Context 的 RunXmlScriptFromFile() 或 InitFromXmlFile() 來開啟 XML 檔 • 範例: • 方法一: • xn::Context xContext; xn::ScriptNode xScript; xContext.Init(); xContext.RunXmlScriptFromFile("test.xml", xScript ); • 方法二: • xn::Context xContext; xn::ScriptNode xScript; xContext.InitFromXmlFile("test.xml", xScript ); http://kheresy.wordpress.com/ 建立 Production Node • 由於 Production Node 都已經透過 XML 檔建立好了,所以建立 Node 的方法由 • xn::DepthGenerator xDepth; xDepth.Create( xContext ); • 改為 • xn::DepthGenerator xDepth; xContext.FindExistingNode(XN_NODE_TYPE_DEPTH, xDepth ); http://kheresy.wordpress.com/ Example 10_XML http://kheresy.wordpress.com/ OpenNI XML 基本架構 • http://kheresy.wordpress.com/ OpenNI XML – Licenses • 提供 OpenNI Context 額外的授權資料 • 等同於 xn::Context::AddLicense() • 範例 http://kheresy.wordpress.com/ OpenNI XML – Log • 紀錄 OpenNI 的各種事件 • 範例: • Log Level • 0: 詳細、1: 資訊、2: 包含警告、3: 錯誤(預設) http://kheresy.wordpress.com/ OpenNI XML – Production Nodes • 針對各個 Production node 進行設定 • 結構 http://kheresy.wordpress.com/ OpenNI XML – Node • 建立 OpenNI 的 Production Node • 等同於 xn::Context::CreateAnyProductionTree() • 屬性 • 一定要有「type」這個屬性(attribute) • Device, Depth, Image, IR, Audio, Gesture, User, Scene, Hands, Recorder • 可以賦予「name」這個屬性、指定它的名稱 • 子節點: • Query:設定這個 node 的必要條件 • Configuration:設定參數(包含 capability) http://kheresy.wordpress.com/ OpenNI XML – Node Query • 對應到 xn::Query 的各項設定 vendor1 name1 1.0.0.0 3.1.0.5 UserPosition Mirror 2 MyDevice http://kheresy.wordpress.com/ OpenNI XML – Node Configuration • 範例 http://kheresy.wordpress.com/ OpenNI XML – Node Configuration 名稱 適用於 等同於 Mirror 支援 mirror capability 的 generator xn::MirrorCapability::SetMirror() MapOutputMode Map generator (depth, image, IR, scene) xn::MapGenerator::SetMapOutputMode() WaveOutputMode Audio generator xn::AudioGenerator::SetWaveOutputMode() Cropping 支援 cropping capability 的 map generator xn::CroppingCapability::SetCropping() PixelFormat Image generator xn::ImageGenerator::SetPixelFormat() UserPosition Depth generator xn::UserPositionCapability::SetUserPosition() http://kheresy.wordpress.com/ OpenNI XML – Node Configuration 名稱 適用於 等同於 FrameSync 支援 Frame Sync capability 的 generator xn::FrameSyncCapability::FrameSyncWith() AlternativeViewPoint 支援 Alternative View Point capability 的 generator xn::AlternativeViewPointCapability::SetViewPoint() RecorderDestination Recorder xn::Recorder::SetDestination() AddNodeTo Recording Recorder xn::Recorder::AddNodeToRecording() Property 一般 production node xn::ProductionNode::SetIntProperty() xn::ProductionNode::SetRealProperty() xn::ProductionNode::SetStringProperty() http://kheresy.wordpress.com/ 範例 AlternativeViewPoint im1 http://kheresy.wordpress.com/ 範例:強制錄製 ONI 檔 http://kheresy.wordpress.com/ 資料產生 • 預設會自動開始產生資料 • 就像呼叫 xn::Context::StartGeneratingAll() 一樣 • ProductionNodes 和 Node 可以透過 startGenerating 個別控制 • 例如
还剩31页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

shanier

贡献于2013-08-21

下载需要 3 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf