将红外图像映射到 RealSense 库中的彩色图像

问题描述 投票:0回答:2

我目前使用 Intel d435 摄像头。 我想与左红外相机和彩色相机对齐。

RealSense库提供的align函数只能对齐深度和颜色。

听说RealSense Camera已经与左红外摄像头和深度摄像头对齐了。

但是,我无法使用此信息映射红外图像和彩色图像。通过对齐函数再次将深度图像设置为彩色图像。我想知道如何将彩色图像与设置为初始状态深度的左红外图像相匹配。

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 【Realsense 客户工程团队点评】 @帕内波 librealsense 演示中使用的对齐类在深度和其他流之间映射,反之亦然。我们不提供其他形式的流对齐。

但是建议您尝试一下,基本上映射是一种三角测量技术,我们通过 3D 空间中像素的交点来找到其在另一帧中的原点,当源数据为深度时,此方法可以正常工作( Z16 格式)。在两个非深度流之间进行映射的一种可能方法是播放三个流(深度+IR+RGB),然后计算深度到颜色的 UV 贴图,然后使用此 UV 贴图重新映射 IR 帧(记住深度和左IR 按设计对齐)。

希望建议能给您一些想法。 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 这是Intel公司建议的方法。

您能解释一下通过使用深色和彩色图像创建 UV 贴图来解决问题意味着什么吗? RealSense2库有UV贴图功能吗?

我需要您宝贵的答案。

opencv camera camera-calibration infrared realsense
2个回答
0
投票

是的,英特尔实感 SDK 2.0 提供了 PointCloud 类。 那么你 -配置传感器 - 开始串流 - 获取颜色和深度帧 - 获取UV贴图如下(C#):

var pointCloud = new PointCloud();
pointCloud.MapTexture(colorFrame);
var points = pointCloud.Calculate(depthFrame);
var vertices = new Points.Vertex[depth frame height * depth frame width];
var uvMap = new Points.TextureCoordinate[depth frame height * depth frame width];
points.CopyTo(vertices);
points.CopyTo(uvMap);

您将获得的 uvMap 是标准化深度到颜色映射

注意:如果深度与颜色对齐,则使用颜色框宽度和高度计算顶点和 UV 贴图的大小


0
投票

与 Valeria 相同的代码,但使用 Realsense sdk 2 于 2024 年 4 月下载的最新 .net 包装器。

var pointCloud = new PointCloud();
pointCloud.MapTexture(colorFrame);
var points = pointCloud.Process(depthFrame).As<Points>();
//3d points
var vertices = new float[points.Count * 3];
points.CopyVertices(vertices);
//2d map to texture
var texture_map = new float[points.Count * 2];
points.CopyTextureCoords(texture_map);

texture_map值从0归一化到1。因为深度图像的范围比彩色图像大,所以某些深度点无法映射。这些点将具有 0 或负值。

对于其他点,映射类似于texture_map[2x + ystride],texture_map[2x+ystride +1]将提供对应于深度点(x,是)。 stride 是深度图像宽度 * 2。映射的颜色点将为 (texture_map[2x + ystride]* color_width,texture_map[2x+ystride +1] *color_width)。

也可以查询texture_map数组以从颜色点获取深度点

private static System.Drawing.Point MapColor2Depth(System.Drawing.Point pt)
{
    int x = pt.X;
    int y = pt.Y;
    int index = -1;
    if(int_texture_map!=null)
    for(int i=0;i<int_texture_map.Length;i+=2)
    {

        if((x>=int_texture_map[i]-1 && x<= int_texture_map[i] + 1) && 
               ( y>=int_texture_map[i+1]-1  && y <= int_texture_map[i + 1] + 1))
        {
            index = i;
            break;
        }
    }
    if (index >= 0)
        return new System.Drawing.Point((index % stride_)/2, index / stride_);

    return System.Drawing.Point.Empty;
}

int_texture_map 是包含标准化纹理_map 计算后的实际映射的数组

© www.soinside.com 2019 - 2024. All rights reserved.