目前找到了幾個(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ì)研究晋涣,記錄如下:
-
Kinect深度圖與攝像頭RGB的標(biāo)定與配準(zhǔn) 作者:aipiano
搭配外置RGB相機(jī)的Kinect一代的標(biāo)定+配準(zhǔn)過程仪媒,計(jì)算了深度坐標(biāo)系和彩色坐標(biāo)系的變換矩陣,看起來很有可操作性谢鹊。 -
kinect 2.0 SDK學(xué)習(xí)筆記(二)--坐標(biāo)映射 和 kinect 2.0 SDK學(xué)習(xí)筆記(四)--深度圖與彩色圖對齊 作者:jiaojialulu
前者解釋了如何通過windows SDK將獲得到的原始數(shù)據(jù)進(jìn)行坐標(biāo)空間的映射算吩,還有一個(gè)使用MapDepthFrameToColorSpace
函數(shù)的例子(注意是Depth To Color,上邊的是Color To Depth)佃扼;后者講了不用SDK函數(shù)的話怎么做配準(zhǔn)偎巢,包括標(biāo)定、轉(zhuǎn)換公式的計(jì)算和代碼實(shí)現(xiàn)兼耀,和本列表的第一個(gè)例子是一種類型压昼。 -
Kinect數(shù)據(jù)提取與坐標(biāo)變換 作者:熊白白
基于Kinect一代,綜合Developer Toolkit中C#范例 Color Basics瘤运,Depth Basics窍霞,Coordinate Mapping Basics 部分,配準(zhǔn)使用了SDK函數(shù)MapColorFrameToDepthFrame
和MapDepthFrameToColorFrame
拯坟。 -
Kinect For Windows V2開發(fā)日志七:照片合成與背景消除 作者:Beginner_YH
里面有部分程序是深度圖和彩色圖的像素對齊配準(zhǔn)但金,也是使用了SDK的MapColorFrameToDepthSpace
函數(shù)。 -
Kinect學(xué)習(xí)筆記六CoordinateMapping上 作者:云中留夢
博客的六七八都是關(guān)于映射的似谁,雖然博主貌似更關(guān)注骨骼信息和它們的映射傲绣,而且是C#的,但是有一些各種空間的和相互映射的介紹巩踏。 -
kinect深度圖和彩圖對準(zhǔn)的源代碼秃诵, 附上數(shù)據(jù)一組 作者:qinhl060343 秦洪亮
還沒看懂。塞琼。菠净。另外存數(shù)據(jù)的網(wǎng)盤已經(jīng)崩了。彪杉。毅往。
其他:
- 圖像配準(zhǔn)簡介 各種類型的配準(zhǔn)方法介紹
- 深度圖像與彩色圖像的配準(zhǔn)方法研究 2012年華南理工大學(xué)的碩士論文,使用Harris-Laplace角點(diǎn)檢測算法和SIFT特征點(diǎn)檢測進(jìn)行特征匹配
- 深度圖像配準(zhǔn)(Registration)原理