Kinect的彩圖和景深圖兩個圖是不對齊的,DepthImageFrame提供了MapToColorImagePoint方法用以計算指定景深圖坐标所對應的彩圖點。原以為從景深圖坐标到彩圖坐标是仿射變換關系,是以,在對齊時,在景深圖指定了三個點(0,0),(0,400),(400,0),計算這三個點對應的彩圖坐标,然後再求出變換矩陣,進行坐标變換。昨天客戶反應,當人物走到攝像頭的右側時,會出現圖像錯位現象:
懷疑是否是景深圖和彩圖對齊的問題。下面進行詳細測試,對景深圖每隔10個像素點進行采樣,計算對應的彩圖坐标,繪制在同一張圖上,景深圖坐标為紅點,彩圖坐标為綠點。
比對代碼:
<a></a>
private List<Point> points = new List<Point>();
for (int x = 0; x < 640; x += 10)
{
for (int y = 0; y < 480; y += 10)
{
ColorImagePoint p = depthImageFrame.MapToColorImagePoint(x, y, ColorImageFormat.RgbResolution640x480Fps30);
points.Add(new Point(p.X, p.Y));
points.Add(new Point(x, y));
}
}
繪制代碼:
Point[] list = points.ToArray();
Bitmap match = new Bitmap(640, 480);
Graphics g = Graphics.FromImage(match);
Pen pen1 = new Pen(Color.Red, 2);
Pen pen2 = new Pen(Color.Green, 2);
int i = 0;
foreach (Point p in list)
i++;
if (i % 2 == 0)
{
g.DrawLine(pen1, p, new Point(p.X + 1, p.Y + 1));
}
else
g.DrawLine(pen2, p, new Point(p.X + 1, p.Y + 1));
match.Save("match_" + timeString + ".png", System.Drawing.Imaging.ImageFormat.Png);
其中,timeString 記錄的是目前時間。
結果如下:
可以看出,它是一個很複雜的場,用肉眼可以看出有16個特殊位置:
不去深究這十六個點時什麼。從上面可以看出,這個變換不是仿射變換,無法使用仿射變換矩陣。應該進行逐點變換。KinectSensor類提供了逐點變換的方法:MapDepthFrameToColorFrame。
現在需要了解,景深圖和彩圖的坐标變換關系是穩定的還是不穩定的呢(随着時間推移,這個變換關系會不會發生改變?),如果是穩定的,我們隻需要求一次變換,如果不是穩定的,則需要每次都要求解變換。
将兩個不同時間點生成的比對圖拖到photoshop中,将紅點對齊,可以發現綠點也是對齊的,隻有一張圖例外,右上角未對齊,差别也不大:
由此可見,這個對齊關系比較穩定,可以隻計算一次,把結果存儲起來,坐标變換時,查表就行了。
本文轉自xiaotie部落格園部落格,原文連結http://www.cnblogs.com/xiaotie/archive/2012/03/09/2386085.html如需轉載請自行聯系原作者
xiaotie 集異璧實驗室(GEBLAB)