2012-08-02 679 views
2

我正在開發一個項目,該項目使用Kinect和OpenCV將導出的最終座標導出到Flash,以用於遊戲和其他程序。目前,我們的設置基於顏色並將指尖輸出爲(x,y,z)格式的Flash,其中x和y以像素爲單位,z以毫米爲單位。但是,我們希望使用Flash中的z深度值將這些(x,y)座標映射到「真實世界」值,如毫米。Kinect - 使用深度將地圖(x,y)像素座標轉換爲「真實世界」座標

據我所知,Kinect 3D深度是通過投影X軸沿着相機的水平線獲得的,Y軸是沿着相機的垂直軸線,而Z軸是從相機鏡頭直接向前的。深度值就是從任何給定物體到XY平面的垂線長度。請參閱下面鏈接中的圖片(從微軟網站獲得)。

Microsoft Depth Coordinate System Example

另外,我們知道的Kinect的視野的水平場在117度的角度投射。

使用此信息,我想我可以將任意給定點的深度值投影到x = 0,y = 0線上,並在該點繪製平行於XY平面的水平線,與相機的場視力。我最終得到一個三角形,分成兩半,高度爲所討論對象的深度。然後,我可以使用一個小三角解決視野的寬度。我的方程是:

W = TAN(THETA/2)* H * 2

其中:

  • W =視場寬度
  • THETA =視場角的水平視場(117度)
  • H =深度值

(對不起,我不能發佈圖片,我想如果我可以)

現在,求解深度值爲1000mm(1米)的值爲約3264mm。

但是,實際上在生成相機圖像時,我會得到不同的值。也就是說,我在離攝像機1米遠的地方放了一根米棒,注意到畫面的寬度最多隻有1.6米,而不是估算的3.264米。

有什麼我在這裏失蹤?任何幫助,將不勝感激。

+0

是從Kinect的儀表杆1米?或者距離它的起始加工範圍一米?如果直接從相機中獲取距離並將該距離添加到Kinect未命中的距離 – 2012-08-04 02:18:24

+2

您使用Kinect的哪個庫:官方的KinectSDK,libfreenect,OpenNI? – 2012-08-04 08:17:26

+0

我使用官方的Kinect SDK,Kinect補償了它無法讀取的深度(意思是它的起始深度大約超過30釐米)。在繼續進行中,我決定重構我的項目以使用Kinect將深度座標映射到骨架座標。 – user1449837 2012-08-07 21:41:34

回答

2

有幾件事情:

A)我知道你在Kinect傳感器的功能得到了117度的視野,但我仍然不相信這是正確的。這是一個巨大的FOV。當我在Kinect上運行該功能時,我實際上獲得了相同的編號,但我仍然不相信它。雖然57(或某些來源的58.5)似乎很低,但它肯定更合理。嘗試將Kinect放置在平坦的表面上,並將對象放置在其視圖內並以此方式測量FOV。不準確,但我不認爲你會發現它超過100度。 B)我看到一篇文章證明實際距離與Kinect的報告深度;它不是線性的。這實際上並不會影響你的1.6米觸發問題,但這是要記住的事情。C)我強烈建議將代碼更改爲接受來自Kinect的真實世界點。更好的是,只要有可能就發送更多的數據。您可以繼續提供當前的數據,並將實際的座標數據添加到該數據上。

+0

啊,是的,我知道這個功能。但是,我試圖從Flash中進行這種計算,而Flash不能訪問該函數。 潛在地,我可以重構我的整個項目來使用它,但我想避免這種情況。 – user1449837 2012-08-02 20:16:01

+0

@ user1449837:啊,我的錯。其實,你從哪裏得到117度?我的印象是Kinect的水平FOV是57度。 – Coeffect 2012-08-02 20:21:47

+1

從Kinect對象的DepthImageStream屬性中,您可以使用nominalhorizo​​ntalfieldofview來獲取Kinect的水平FOV,您可以使用vertical的垂直視野。在我的Kinect製作的117上使用它,三角法則要求我在實際計算中將其削減到一半,達到58.5。這顯然是文檔中的一個錯誤,我從這個討論中得到了這個想法: http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/8d292fe3-d832-455f-93c5-1d119a0ee997 – user1449837 2012-08-02 20:28:02

4

深度流是正確的。您應該確定深度值,然後從Kinect傳感器中,可以輕鬆找到相對於Kinect的現實世界中的點。這是通過簡單的三角函數完成的,但是您必須記住深度值是從Kinect「眼睛」到測量點的距離,所以它是一個長方體的對角線。

其實,請點擊此鏈接How to get real world coordinates (x, y, z) from a distinct object using a Kinect

這是沒有用的重寫,有你有正確的答案。

0

向量減法應該可以得到Kinect給出的任意兩點之間的距離。你必須查找在特定環境中執行矢量減法的最佳方式,但我希望這有助於無論如何。在我使用的Processing中,有一個PVector類,其中簡單地去掉PVector差異= PVector.sub(vector1,vector2),其中vector1和vector2是代表兩個點的向量,差異是兩點。然後您需要差異向量的大小。同樣,在處理過程中,這可以通過magnitude = difference.mag()簡單地找到。這個數量應該是你想要的距離。

下面是處理這兩種載體,一般載體的一個偉大的破敗:https://processing.org/tutorials/pvector/

相關問題