将深度像素映射到彩色像素

时间:2013-11-25 08:53:29

标签: c++ opencv kinect

我是kinect的新手。谁能告诉我如何将深度像素映射到彩色像素? 我找到了这个示例代码:

P3D.x = (x_d - cx_d) * depth(x_d,y_d) / fx_d

P3D.y = (y_d - cy_d) * depth(x_d,y_d) / fy_d

P3D.z = depth(x_d,y_d)

P3D' = R.P3D + T

P2D_rgb.x = (P3D'.x * fx_rgb / P3D'.z) + cx_rgb

P2D_rgb.y = (P3D'.y * fy_rgb / P3D'.z) + cy_rgb

我在没有kinect的情况下工作,当我在我的c ++程序中使用这段代码时,我遇到了很多错误。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您也可以使用OpenKinect/freenect。有C ++和OpenCV的包装器,效果很好。如果你想在没有kinect的情况下测试你的代码,可以使用libfreenect中包含的fakenect。

关于校准和相机到真实世界坐标,最简单的方法是使用freenect的默认参数使用FREENECT_DEPTH_REGISTERED标志对齐颜色和深度图像。如果您选择使用此选项,您将需要通过FREENECT_DEPTH_REGISTERED标志替换所有FREENECT_DEPTH_11BIT的假冒行为here

此功能void freenect_camera_to_world(freenect_device* dev, int cx, int cy, int wz, double* wx, double* wy);允许您使用注册模式映射具有深度像素的彩色像素。如果你想做相反的事情(用彩色像素映射深度像素),那里有很好的解释:

http://nicolas.burrus.name/index.php/Research/KinectCalibration http://labs.manctl.com/rgbdemo/index.php/Documentation/KinectCalibrationTheory

答案 1 :(得分:0)

答案 2 :(得分:0)

通过使用Kinect SDK读取U,V纹理映射参数,您可以轻松地将像素从深度帧映射到颜色帧的像素。对于深度帧D(i,j)的每个像素坐标(i,j),颜色帧的对应像素坐标由(U(i,j),V(i,j))给出,因此给出颜色通过C(U(i,j),V(i,j))。

U,V功能包含在每个Kinect的硬件中,它们从Kinect到Kinect不同,因为Depth相机与摄像机的对齐方式不同,因为在工厂硬件板上粘合时会有微小的差异。但是如果您从Kinect SDK中读取U,V,则不必担心。

下面我给出一个图像示例和一个实际的源代码示例,使用Java中的Kinect SDK和J4K open source library(您可以在C / C ++中自己做类似的事情):

public class Kinect extends J4KSDK{

    VideoFrame videoTexture; 

public Kinect() { 
    super(); 
    videoTexture=new VideoFrame(); 
}

@Override 
public void onDepthFrameEvent(short[] packed_depth, int[] U, int V[]) { 
    DepthMap map=new DepthMap(depthWidth(),depthHeight(),packed_depth); 
    if(U!=null && V!=null) map.setUV(U,V,videoWidth(),videoHeight()); 
} 

@Override 
public void onVideoFrameEvent(byte[] data) {     
    videoTexture.update(videoWidth(), videoHeight(), data); 
} }

图像示例显示了相同Depth-Video对齐帧的3个不同视角: enter image description here

我希望这对你有帮助!