我是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 ++程序中使用这段代码时,我遇到了很多错误。
提前致谢。
答案 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)
使用Kinect SDK中提供的CoordinateMapper。
http://msdn.microsoft.com/en-us/library/microsoft.kinect.coordinatemapper_methods.aspx
答案 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个不同视角:
我希望这对你有帮助!