2014-10-27 86 views
5

我使用來自kinect的rgb數據跟蹤球。在此之後,我查找相應的深度數據。這兩個都很出色。現在我想擁有實際的x,y,z世界座標(即骨架空間),而不是x_screen,y_screen和depth值。不幸的是,由kinect sdk(http://msdn.microsoft.com/en-us/library/hh973078.aspx)給出的方法不能幫助我。基本上我需要一個函數「NuiImageGetSkeletonCoordinatesFromColorPixel」,但我不存在。所有的功能基本走向相反的方向Kinect:從色彩空間到世界座標

我知道這大概可以用openNI做,但我不能將其用於其他原因。

有沒有做這個工作,我還是我必須做轉換自己的功能?如果我必須自己做,我該怎麼做?我畫了一個小圖http://i.imgur.com/ROBJW8Q.png - 你認爲這會起作用嗎?

+0

爲什麼['NuiTransformDepthImageToSkeleton'(http://msdn.microsoft.com/en-us/library/jj663871.aspx)不是爲你工作? – 2014-10-28 22:15:24

+0

我使用顏色進行跟蹤。所以我有x,y在「rgb-space」中。然後,我使用另一個sdk函數將深度數據轉換爲rgb空間:NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution查找相應的深度值。不幸的是,這個函數沒有反轉,所以我無法回到深度空間。但對於NuiTransformDepthImageToSkeleton我需要X,Y向縱深空間:( [編輯]:還是這其實只是我的一個誤解,當他們說的文檔中。「的深度像素的x座標」,做他們實際上指的是X,Y在RGB空間? – AnonEnginerd 2014-10-29 22:49:15

+1

啊對不起,我誤會了...我會看到[這個問題](http://stackoverflow.com/questions/11902593/get-depth-at-color-position-kinect-sdk ),因爲它聽起來完全像你想要的 – 2014-10-29 23:07:29

回答

3

檢查CameraIntrinsics。

typedef struct _CameraIntrinsics 
{ 
    float FocalLengthX; 
    float FocalLengthY; 
    float PrincipalPointX; 
    float PrincipalPointY; 
    float RadialDistortionSecondOrder; 
    float RadialDistortionFourthOrder; 
    float RadialDistortionSixthOrder; 
} CameraIntrinsics; 

你可以從ICoordinateMapper::GetDepthCameraIntrinsics得到它。

然後,在深度空間中的每個像素(u,v,d),你可以通過這樣的世界空間座標:

x = (u - principalPointX)/focalLengthX * d; 
y = (v - principalPointY)/focalLengthY * d; 
z = d; 

對於色彩空間像素,你需要先找到與它關聯的深度空間像素,其你應該使用ICoordinateMapper::MapCameraPointTodepthSpace。由於並非所有彩色像素都具有相關的深度像素(1920x1080 vs 512x424),因此您無法使用全高清彩色點雲。