Kinect學(xué)習(xí)(5)——深度圖與彩色圖配準(zhǔn)(學(xué)習(xí)版1)

目前找到了幾個(gè)Kinect配準(zhǔn)程序,都跑通了袍辞,先學(xué)習(xí)一下他們的想法浆兰,代碼都添加了注釋。
我的環(huán)境:Win 10 + Kinect 2.0+VS 2013 + OpenCV 2.4.13

1家妆、Kinect深度圖與彩色圖的坐標(biāo)校準(zhǔn)

作者:Michael__Shi
作者環(huán)境:Windows 8.1 + Kinect 2.0 + VS 2012 + OpenCV2.4.8

先用規(guī)則的長方體來測一下在深度圖和彩色圖中的同一邊長的比例鸵荠,為了測量更加準(zhǔn)確,就把深度圖同一時(shí)間的深度圖和彩色圖給截圖下來伤极,然后通過matlab來實(shí)現(xiàn)坐標(biāo)顯示蛹找,來得到同一位置長方體的同一邊長,通過求幾組數(shù)據(jù)的平均得到深度圖和彩色圖的比例哨坪,這樣庸疾,在使用OpenCV的resize函數(shù)便將深度圖和彩色圖的比例調(diào)整為1:1了。最后通過將同一點(diǎn)在深度圖和彩色圖中的坐標(biāo)關(guān)系來將兩種圖的坐標(biāo)關(guān)系對應(yīng)好当编,這樣便實(shí)現(xiàn)了坐標(biāo)的對應(yīng)彼硫,通過opencv的ROI來將兩幅圖重合的部分裁剪下來,并且在同一幅畫面中顯示凌箕。

核心代碼:
1)深度圖處理

    // 之前已經(jīng)把深度數(shù)據(jù)轉(zhuǎn)換為8位RGB像素拧篮,下面把深度像素轉(zhuǎn)存到8位4通道的Mat內(nèi)  
    Mat DepthImage(nHeight, nWidth, CV_8UC4, m_pDepthRGBX);  
    Mat show = DepthImage.clone();  

    // 用resize函數(shù)把寬、高分辨率都擴(kuò)大到原來的1.437倍牵舱,存儲(chǔ)到showImageDepth內(nèi)  
    resize(DepthImage, show, Size(cDepthWidth*1.437 , cDepthHeight*1.437));  
    showImageDepth = show.clone();  

    // 顯示的仍然是原始分辨率           
    imshow("DepthImage", show);  

2)彩色圖處理和配準(zhǔn)

    // 之前已經(jīng)獲取了彩色圖的8位RGB像素串绩,下面把彩色圖像素轉(zhuǎn)存到8位4通道Mat內(nèi)
    Mat ColorImage(nHeight, nWidth, CV_8UC4, pBuffer);

    // 用resize函數(shù)把寬、高分辨率都縮小為原來的1/2 
    Mat showImage = ColorImage.clone();
    resize(ColorImage, showImage, Size(nWidth / 2, nHeight / 2));

    // 矩形Rect芜壁,函數(shù)原型是 Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height); 
    // 前兩個(gè)參數(shù)表示矩形左上角的坐標(biāo)礁凡,后兩個(gè)參數(shù)表示矩形的寬和高 
    Rect rect(145, 0, 702, 538);

    // 偏移量為(33,-145)慧妄,即彩色(i顷牌,j)對應(yīng)深度(i+33,j-145)
    // opencv坐標(biāo)對應(yīng)關(guān)系是(x塞淹,y)對應(yīng)(列號col窟蓝,行號row)
    // 對應(yīng)坐標(biāo)的深度與彩色像素按照 0.6:0.4 比例相加混合到新的Mat showImage內(nèi)
    int x = 33, y = -145;
    for (int i = 0; i <540; i++)
        for (int j = 145; j < 960 - 114; j++)
            showImage.at<Vec4b>(i, j) = showImageDepth.at<Vec4b>(i + x, j + y)*0.6 + showImage.at<Vec4b>(i, j)*0.4;

    // 用矩形指定showImage的感興趣區(qū)域(不感興趣區(qū)域應(yīng)該是配準(zhǔn)效果不好的區(qū)域)
    Mat image_roi = showImage(rect);
    // 顯示感興趣區(qū)域,也是配準(zhǔn)后的結(jié)果 
    imshow("Image_Roi", image_roi);

總結(jié)起來就是饱普,先測量了深度圖和彩色圖上同一邊長的比例运挫,測量結(jié)果是1.437x2=2.874;然后在Opencv里按這個(gè)比例把兩幅圖調(diào)整成同樣大小套耕,深度圖尺寸放大1.437倍谁帕,彩色圖尺寸縮小一半;最后考慮到邊緣的配準(zhǔn)效果不好冯袍,因此只保留和顯示中間配準(zhǔn)好的矩形區(qū)域匈挖。

這個(gè)方法相當(dāng)于只做了尺寸變換碾牌,還真是簡單粗暴啊。儡循。舶吗。另外2.874的比例應(yīng)該是圖內(nèi)物體長度的比例,而不是圖片的比例吧

2贮折、通過Kinect v2.0+ VS2012+openCV2.4.9將彩色幀映射到深度空間

作者:xx__hu
這段程序是基于MapColorFrameToDepthSpace實(shí)現(xiàn)配準(zhǔn)的裤翩。

核心代碼:

    //Color Frame 獲取彩色圖资盅,為了避免尺寸太大顯示不便调榄,用resize把彩色圖的寬、高都縮小為原來的一半呵扛,存在CV_8UC4的colorMat內(nèi)
    ... ...
    resize(colorBufferMat, colorMat, Size(), 0.5, 0.5);

    //Depth Frame 獲取彩色圖每庆,convertTo函數(shù)的作用是轉(zhuǎn)換數(shù)據(jù)類型不同的Mat今穿,這里的意義是把深度數(shù)據(jù)轉(zhuǎn)化為像素值
    ... ...
    depthBufferMat.convertTo(depthMat, CV_8U, -255.0f / 8000.0f, 255.0f);

    // Mapping ( Depth to Color ) 配準(zhǔn)
    if (SUCCEEDED(hResult))
    {
        // 深度空間坐標(biāo)點(diǎn)集
        vector<DepthSpacePoint> depthSpacePoints(colorWidth *colorHeight);

        // 實(shí)際的配準(zhǔn)語句缤灵,這里就用了MapColorFrameToDepthSpace函數(shù),函數(shù)說明在下面
        hResult = pCoordinateMapper->MapColorFrameToDepthSpace(depthWidth * depthHeight,
            reinterpret_cast<UINT16*>(depthBufferMat.data), colorWidth *colorHeight,
                &depthSpacePoints[0]);

        if (SUCCEEDED(hResult))
        {
            CoordinateMapperMat = Scalar(0, 0, 0, 0); // 定義為Mat(colorHeight, colorWidth, CV_8UC4)
            // 遍歷彩色圖所有的點(diǎn)
            for (int y = 0; y < colorHeight; y++)
            {
                for (int x = 0; x < colorWidth; x++)
                {
                    // 按照彩色圖像素坐標(biāo)生成深度坐標(biāo)點(diǎn)集的索引index蓝晒,根據(jù)索引得到對應(yīng)深度點(diǎn)
                    unsigned int index = y * colorWidth + x;
                    DepthSpacePoint p = depthSpacePoints[index];
                    // 如果對應(yīng)深度點(diǎn)坐標(biāo)沒有超限腮出,就把對應(yīng)彩色點(diǎn)賦給新Mat CoordinateMapperMat(?)
                    if (p.X != -std::numeric_limits<float>::infinity() && p.Y != -std::numeric_limits<float>::infinity())
                    {
                        int depthX = static_cast<int>(p.X + 0.2f);
                        int depthY = static_cast<int>(p.Y + 0.2f);

                        if ((depthX >= 0) && (depthX < depthWidth) && (depthY >= 0) && (depthY < depthHeight))
                        {
                            CoordinateMapperMat.at<Vec4b>(y, x) = colorBufferMat.at<Vec4b>(y, x);                               
                        }
                    }
                }
            }
        }
    }
    imshow("depth", depthMat);
    imshow("color", colorMat);
    // CoordinateMapperMat就是要顯示的配準(zhǔn)結(jié)果
    imshow("CoordinateMapper", CoordinateMapperMat); 
ICoordinateMapper::MapColorFrameToDepthSpace Method

根據(jù)官網(wǎng)上MapColorFrameToDepthSpace的函數(shù)說明:
Uses the depth frame data to map the entire frame from color space to depth space.
使用深度幀數(shù)據(jù)芝薇,從彩色空間向深度空間映射整個(gè)幀胚嘲。

public:
HRESULT MapColorFrameToDepthSpace(
         UINT depthDataPointCount,
         const UINT16 *depthFrameData,
         UINT depthPointCount,
         DepthSpacePoint *depthSpacePoints
)
  • depthDataPointCount:深度數(shù)據(jù)點(diǎn)的數(shù)量,就是深度圖的寬x高
  • depthFrameData:深度幀數(shù)據(jù)
  • depthPointCount:深度點(diǎn)的數(shù)量洛二,實(shí)際上是指要匹配的深度點(diǎn)的數(shù)量馋劈,也就是彩色點(diǎn)的數(shù)量,彩色圖的寬x高
  • depthSpacePoints:要存放深度空間點(diǎn)坐標(biāo)的集合

函數(shù)運(yùn)行后晾嘶,depthSpacePoints內(nèi)按彩色圖像素的順序存放對應(yīng)的深度點(diǎn)坐標(biāo)妓雾。之后按彩色圖像素逐行掃描的順序遍歷坐標(biāo)集合,如果配準(zhǔn)正確(坐標(biāo)有效)垒迂,就把該點(diǎn)的彩色像素值賦給一個(gè)和彩色圖同樣大小類型的Mat械姻,并顯示出來。所以机断,所謂的配準(zhǔn)結(jié)果其實(shí)是殘缺的彩色圖的樣子策添,正常顯示的地方表示配準(zhǔn)成功,沒有像素的地方(黑色)表示配準(zhǔn)失敗毫缆。

實(shí)際運(yùn)行結(jié)果還可以唯竹,殘缺區(qū)域主要來源于深度圖的殘缺。但幀率很慢苦丁,大約也就1fps左右吧浸颓。另外,我覺得應(yīng)該按上一個(gè)例子那樣把深度圖和彩色圖疊加起來顯示,這樣才能更直觀的看出配準(zhǔn)結(jié)果产上。

另外棵磷,還有一些Kinect配準(zhǔn)的例子和教程,還沒有實(shí)踐和詳細(xì)研究晋涣,記錄如下:

其他:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末派近,一起剝皮案震驚了整個(gè)濱河市攀唯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渴丸,老刑警劉巖侯嘀,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件另凌,死亡現(xiàn)場離奇詭異,居然都是意外死亡戒幔,警方通過查閱死者的電腦和手機(jī)吠谢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诗茎,“玉大人工坊,你說我怎么就攤上這事「叶” “怎么了王污?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枢析。 經(jīng)常有香客問我玉掸,道長刃麸,這世上最難降的妖魔是什么醒叁? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮泊业,結(jié)果婚禮上把沼,老公的妹妹穿的比我還像新娘。我一直安慰自己吁伺,他們只是感情好饮睬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著篮奄,像睡著了一般捆愁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窟却,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天昼丑,我揣著相機(jī)與錄音,去河邊找鬼夸赫。 笑死菩帝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茬腿。 我是一名探鬼主播呼奢,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼切平!你這毒婦竟也來了握础?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悴品,失蹤者是張志新(化名)和其女友劉穎禀综,沒想到半個(gè)月后郎哭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菇存,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年夸研,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片依鸥。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亥至,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贱迟,到底是詐尸還是另有隱情姐扮,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布衣吠,位于F島的核電站茶敏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缚俏。R本人自食惡果不足惜惊搏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忧换。 院中可真熱鬧恬惯,春花似錦、人聲如沸亚茬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刹缝。三九已至碗暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梢夯,已是汗流浹背言疗。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厨疙,地道東北人洲守。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像沾凄,于是被迫代替她去往敵國和親梗醇。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容