Kinect v2,将3D点云投影成彩色图像
Kinect v2, projection of 3D point cloud into color image
我正在使用 Kinect V2 捕捉 3D 点云及其对应的彩色图像。为了将一些 3D 模型正确投影到这个彩色图像中,我需要计算从相机到图像的有效投影矩阵 space.Since Kinect V2 SDK 没有关于 RGB 相机的校准信息,我发现有一个在 coordinateMapper class 中调用 MapCameraPointsToColorSpace 的方法。
此方法 returns 查找 table 包含云中每个 3D 点与图像像素之间的对应关系。从 table,我曾尝试计算 RGB 相机固有矩阵(焦距、主点、图像间距因子)。但是使用计算出的内在矩阵投影的二维点与 Lookup table 中的值之间存在一些误差。我认为发生此错误是因为我没有计算径向失真。我对吗?我应该关心径向失真以通过此查找获得 3D 到 2D 色点之间的精确映射 table?
是的,你是对的。原始 Kinect RGB 图像有失真。最好的方法是首先使用 RGB 相机固有矩阵手动扭曲空白图像并将其用作查找 table.
distort(int mx, int my, float& x, float& y) const
{
float dx = ((float)mx - depth.cx) / depth.fx;
float dy = ((float)my - depth.cy) / depth.fy;
float dx2 = dx * dx;
float dy2 = dy * dy;
float r2 = dx2 + dy2;
float dxdy2 = 2 * dx * dy;
float kr = 1 + ((depth.k3 * r2 + depth.k2) * r2 + depth.k1) * r2;
x = depth.fx * (dx * kr + depth.p2 * (r2 + 2 * dx2) + depth.p1 * dxdy2) + depth.cx;
y = depth.fy * (dy * kr + depth.p1 * (r2 + 2 * dy2) + depth.p2 * dxdy2) + depth.cy;
}
我正在使用 Kinect V2 捕捉 3D 点云及其对应的彩色图像。为了将一些 3D 模型正确投影到这个彩色图像中,我需要计算从相机到图像的有效投影矩阵 space.Since Kinect V2 SDK 没有关于 RGB 相机的校准信息,我发现有一个在 coordinateMapper class 中调用 MapCameraPointsToColorSpace 的方法。
此方法 returns 查找 table 包含云中每个 3D 点与图像像素之间的对应关系。从 table,我曾尝试计算 RGB 相机固有矩阵(焦距、主点、图像间距因子)。但是使用计算出的内在矩阵投影的二维点与 Lookup table 中的值之间存在一些误差。我认为发生此错误是因为我没有计算径向失真。我对吗?我应该关心径向失真以通过此查找获得 3D 到 2D 色点之间的精确映射 table?
是的,你是对的。原始 Kinect RGB 图像有失真。最好的方法是首先使用 RGB 相机固有矩阵手动扭曲空白图像并将其用作查找 table.
distort(int mx, int my, float& x, float& y) const
{
float dx = ((float)mx - depth.cx) / depth.fx;
float dy = ((float)my - depth.cy) / depth.fy;
float dx2 = dx * dx;
float dy2 = dy * dy;
float r2 = dx2 + dy2;
float dxdy2 = 2 * dx * dy;
float kr = 1 + ((depth.k3 * r2 + depth.k2) * r2 + depth.k1) * r2;
x = depth.fx * (dx * kr + depth.p2 * (r2 + 2 * dx2) + depth.p1 * dxdy2) + depth.cx;
y = depth.fy * (dy * kr + depth.p1 * (r2 + 2 * dy2) + depth.p2 * dxdy2) + depth.cy;
}