深度图的实时平滑
from: http://blog.csdn.net/jiaojialulu/article/details/53192887?locationNum=12&fps=1
深度圖的實(shí)時(shí)平滑
一、背景
英文原文,使用的是第一代kinect
youtube上的演示效果
二、深度數(shù)據(jù)存在的問題
下圖是我簡單處理后的深度圖:
藍(lán)色表示采到深度值為0的點(diǎn),而其他點(diǎn)用顏色來標(biāo)識,顏色越深表示離相機(jī)越近。數(shù)據(jù)中的噪聲表現(xiàn)為藍(lán)色斑點(diǎn)在畫面上不斷出現(xiàn)和消失。一些噪點(diǎn)是由于紅外在遇到物體表面時(shí)發(fā)生散射造成的,另一些是由于離得kinect較近的物體的遮擋。
另一個(gè)限制深度數(shù)據(jù)的地方在于kinect的工作范圍(0.8m-4m)。在這個(gè)范圍之外的物體就會表現(xiàn)為無數(shù)據(jù),即深度值為0。
三、解決辦法
作者提出了像素濾波器和加權(quán)移動平均兩種方法,并且能在實(shí)時(shí)的要求下達(dá)到深度圖平滑的效果。
3.1 像素濾波器
3.1.1 原理及步驟
第一步是將深度數(shù)據(jù)幀轉(zhuǎn)換為我們方便處理的形式,比如UINT16[]。
UINT16 *depthData = new UINT16[424 * 512]; m_pDepthFrame->CopyFrameDataToArray(nDepthBufferSize,reinterpret_cast<UINT16*>(depthData));- 1
- 2
下面就是對一幀上的每個(gè)像素搜索,找到深度值為0的位置,我們希望除去這樣的像素,但是又不會影響精度和數(shù)據(jù)的其他特性。那么應(yīng)該如何去做呢?
我們先把深度值為0的像素定為候選濾波對象,然后看看它究竟是否符合我們?yōu)V去它的標(biāo)準(zhǔn)。我們利用它周圍的一些像素對應(yīng)的深度值來定義這個(gè)標(biāo)準(zhǔn)。我們以候選濾波像素為中心定義一個(gè)一個(gè)兩“層”的濾波器,同時(shí)用它來尋找這個(gè)濾波器框內(nèi)其他深度值非零的像素。濾波器將這些深度值做一個(gè)分布,并關(guān)注每層框內(nèi)這種像素的數(shù)量。然后將每層內(nèi)非零像素個(gè)數(shù)與一個(gè)閾值比較,進(jìn)而決定這個(gè)候選像素是否應(yīng)該被濾波。如果任意層內(nèi)非零像素的數(shù)目超過了閾值,就要將所有非零像素深度值對應(yīng)的統(tǒng)計(jì)眾數(shù)(數(shù)目最多一個(gè)深度值)應(yīng)用到候選濾波像素上,使其深度值不為0。濾波器如下圖所示:
下圖主要表明了采用眾數(shù),即濾波器框內(nèi)頻數(shù)最高的一個(gè)深度值來作為候選像素的深度值,要比直接采用框內(nèi)所有深度值的平均要更加符合實(shí)際(我覺得如果改成內(nèi)層的眾數(shù)更好)。
原文使用的是C#,我這里改為C++:
3.1.2 濾波效果
我這里再次把原圖貼上,左圖是濾波后的效果圖:可以看到物體邊緣散亂的深度值為0的點(diǎn)已經(jīng)減少了不少。
3.1.3 代碼
因?yàn)橹皇菫榱死碚撋狭私庀袼貫V波器平滑的機(jī)制,因此我選擇靜態(tài)的讀取kinect采集的原始圖片,然后進(jìn)行平滑。
代碼下載鏈接
請自行配制環(huán)境–kinect 2.0SDK和OpenCV。
下一節(jié)將繼續(xù)講解平滑中的加權(quán)移動機(jī)制
總結(jié)
- 上一篇: Kinect深度图像滤波
- 下一篇: 深度滤波