gpt4 book ai didi

opencv - 如何将 Kinect 的深度数据映射到它的 RGB 颜色?

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:05 64 4
gpt4 key购买 nike

我正在使用 OpenCV 处理给定的数据集,我身边没有任何 Kinect。我想将给定的深度数据映射到对应的 RGB 数据(以便我可以获得实际颜色和深度)

由于我使用的是 OpenCV 和 C++,并且没有 Kinect,遗憾的是我无法使用官方 Kinect API 中的 MapDepthFrameToColorFrame 方法。

根据给定的相机固有参数和畸变系数,我可以将深度映射到世界坐标,然后根据提供的算法返回到 RGB here

Vec3f depthToW( int x, int y, float depth ){
Vec3f result;
result[0] = (float) (x - depthCX) * depth / depthFX;
result[1] = (float) (y - depthCY) * depth / depthFY;
result[2] = (float) depth;
return result;
}

Vec2i wToRGB( const Vec3f & point ) {
Mat p3d( point );
p3d = extRotation * p3d + extTranslation;

float x = p3d.at<float>(0, 0);
float y = p3d.at<float>(1, 0);
float z = p3d.at<float>(2, 0);

Vec2i result;
result[0] = (int) round( (x * rgbFX / z) + rgbCX );
result[1] = (int) round( (y * rgbFY / z) + rgbCY );
return result;
}

void map( Mat& rgb, Mat& depth ) {
/* intrinsics are focal points and centers of camera */
undistort( rgb, rgb, rgbIntrinsic, rgbDistortion );
undistort( depth, depth, depthIntrinsic, depthDistortion );

Mat color = Mat( depth.size(), CV_8UC3, Scalar(0) );
ushort * raw_image_ptr;

for( int y = 0; y < depth.rows; y++ ) {
raw_image_ptr = depth.ptr<ushort>( y );

for( int x = 0; x < depth.cols; x++ ) {
if( raw_image_ptr[x] >= 2047 || raw_image_ptr[x] <= 0 )
continue;

float depth_value = depthMeters[ raw_image_ptr[x] ];
Vec3f depth_coord = depthToW( y, x, depth_value );
Vec2i rgb_coord = wToRGB( depth_coord );
color.at<Vec3b>(y, x) = rgb.at<Vec3b>(rgb_coord[0], rgb_coord[1]);
}
}

但结果似乎错位了。我无法手动设置翻译,因为数据集是从 3 个不同的 Kinect 获得的,并且每个 Kinect 都在不同的方向上未对齐。您可以在下面看到其中一个(左:未失真的 RGB,中间:未失真的深度,右:映射 RGB 到深度)

enter image description here

我的问题是,此时我应该做什么?在尝试将深度投影到世界或将世界投影回 RGB 时,我是否错过了一步?任何有立体相机经验的人都可以指出我的失误吗?

最佳答案

我假设您需要像校准立体相机一样使用 RGB 数据校准深度传感器。 OpenCV 有一些您可以利用的功能(和教程)。

其他一些可能有用的东西

  1. http://www.ros.org/wiki/kinect_calibration/technical
  2. https://github.com/robbeofficial/KinectCalib
  3. http://www.mathworks.com/matlabcentral/linkexchange/links/2882-kinect-calibration-toolbox这包含一篇关于如何做到这一点的论文。

关于opencv - 如何将 Kinect 的深度数据映射到它的 RGB 颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012585/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com