圖像如何打開
如何查看它的數據格式並一個個讀取
試一下ENVI等
可見,灰度圖的Data只有一個值[0],而彩色圖的Data卻有三個值[142,119,113]。
這是用ENVI的Cursor Value工具查看的
深色表示離的近,白色表示離的遠。那么顏色值與深度值的換算公式為?獲取每個像素點的顏色值然后換算成深度值嗎?顏色是RGB,然后深度值是一個數。
鏈接1:網上有不少使用Qt做界面,OpenNI為庫來開發kinect。或許大家的第一個問題就是詢問該怎樣使用Kinect來獲取顏色信息圖和深度信息圖呢?這一節就是簡單來回答這個問題的。 使用OpenNI讀取顏色圖和深度圖的步驟如下(這個是程序的核心部分): 1. 定義一個Context對象,並 調用該對象的Init()方法來進行初始化。 2. 定義一個XnMapOutputMode格式對象,設置好分圖像分辨率和幀率。 3. 定義顏色圖和深度圖的節點對象,並用其Create()方法來創建,參數為Context對象. 4. 設置顏色和深度圖的輸出模式,調用的方法是SetMapOutputMode();參數為步驟2中定義和設置好了的XnMapOutputMode對象。 6. 如果深度圖和顏色圖在一張圖上顯示,則必須對深度圖像進行校正,校正的方法是調用深度圖的如下方法:.GetAlternativeViewPointCap().SetViewPoint(); 7. 調用context對象的StartGeneratingAll()來開啟設備讀取數據開關。 8. 調用context對象的更新數據方法,比如WaitAndupdateAll()方法。 9. 定義顏色圖和色彩圖的ImageMetaData對象,並利用對應的節點對象的方法GetMetaData(),將獲取到的數據保存到對應的ImageMetaData對象中。 10. 如果需要將深度圖轉換成灰度圖來顯示,則需要自己將深度值轉換成0~255的單通道或者多通道數據,然后直接用來顯示。(之間的兌換比例是??) jpg數據流 depth數據流保存為jpg數據然后轉為點雲 也可以減去中間jpg這一步 -->點雲數據處理
深度圖轉灰度圖的轉換比率:無窮遠∞對應白色255,越小表示躍越近,但0也有可能是代表無值。假設3米等於255,那么1等於?0.01176470..米。也就是1.17647厘米。
一張深度圖總共是:640x480=307200個像素點。也就是近30萬像素。
保存數據:
另外,怎么深度圖上有一個黑邊?那么需要跟彩色圖對齊嗎?怎么對齊
Kinect+OpenNI學習筆記之14(關於Kinect的深度信息):kinect的深度值精度,深度值的具體代表的距離是指哪個距離以及kinect深度和顏色掃描范圍等。
首先來看下Kinect性能的基本參數,如下圖所示: Kinect在使用時,微軟官方推薦的距離為1220mm(4’)~3810mm(12.5’),網友heresy在他的博文Kinect + OpenNI 的深度值中 統計過,kinect在距離為1.0m時其精度大概是3mm,而當距離是3.0m時,其精度大概是3cm,因此當kinect在官方推薦的距離范圍內使用 是,如果是1.2m時,其精度應該在3mm附近,如果是3.6m時其精度就大於3cm了,因此距離越遠,其深度值精度越低。另外,通過OpenNI獲取到的深度信息(即z坐標)的單位是mm,這一點在程序編程中要注意,且一般的深度值用12bit(其實是可以用13bit表示的)表示,即最大值為 4095,也就是代表4.095m,所以平時我們采集到的深度數據如果需要擴展到灰度圖,可以乘以一個因子255/4095(為了加快該結果,一般設置為 256/4096,即轉換后的灰度值每變化1,代表kinect采集到的深度值變化了16mm,如果當人的距離為1米左右時,本來精度是3mm,現在經過 歸一化后精度確更加下降了,這時候拿這個距離值來做算法不懂會不會有影響,當然了,拿來做灰度圖像的顯示肯定是OK的),最后如果其深度值為0表示該位置 處偵測不到像素點的深度。 Kinect的偵測范圍入下圖所示:
可以看出,kinect的水平偵測范圍為57度(即以sensor為中心,左右各28.5度)。垂直范圍為43度(同理,以sensor為中心,上下各21.5度)。