本DS最近正做一個項目,關於如何利用dualcamera取代kinect做3D sensor的。這個項目關鍵就是如何將dualcamera獲取的RGB資料與3D深度資料寫入DepthMetaData和ImageMetaData結構裡面。DS開始覺得非常簡單,算我當時太DS了吧,既然有辦法通過 memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2)讀出來,那麼我也可以通過 memcpy(depthMD.Data(),imgDepth16u->imageData,640*480*2)寫進去,當然哥實在太DS了,首先depthMD.Data()返回的是const類型,是不能直接讀寫的,後來哥又DS了,利用const_cast去const ,但仍然無法寫入,因為depthMD的類裡面用於儲存資料的是私有成員,而且這兒是沒有公有函數能改寫的。
後來在極度無助時,瀏覽了heresy大牛的博客,終於發現了一個類似的方法,裡面提及到利用mock(虛擬)方法進行generator之間的數據傳遞,我仿照他的方法利用了這些函數實現了。哥的公司不能上存圖像,太可憐了,辛苦網友們多加想像力。
xn::DepthMap& rDepthMap = xDepthData.WritableDepthMap(); for( unsigned int y = 0; y < rDepthMap.YRes(); ++ y ) for( unsigned int x = 0; x < rDepthMap.XRes(); ++ x ) rDepthMap( x, y ) = 4069;//圖像全白色
哥的公司不能上存圖像,太可憐了,辛苦網友們多加想像力。
雖然實現改寫depthMD數據了,但是DS發現一個大問題,那就是openNI似乎必須在kinect硬件下初始化才成功,主要是context初始化的問題,不知道跟NITE有沒有關系,NITE不是opensource的,大鍋了。