OpenCV拼接RGB和深度(英特尔实感)

时间:2020-05-25 04:00:14

标签: opencv opencv4 opencv-stitching

我有一个使用realsense2和opencv2库的C ++应用程序。我正在从两个D415摄像机中提取深度和RGB帧。我能够毫无问题地缝合RGB帧;但是,经过大量研究,我无法找到有关如何复制从RGB帧针迹到深度帧的步骤的任何示例。有人知道如何将缝合步骤从一个缝合作业(在我的情况下为RGB)复制到另一缝合作业(在我的情况下为深度)吗?

我在这里查看了Stitcher类参考文档:https://docs.opencv.org/master/d2/d8d/classcv_1_1Stitcher.html

如果有人以前这样做过,可以提供一些很好的指导。

这是我用来缝合(缩短)的工作代码:

// Start a streaming pipeline for each connected camera

for (auto && device : context.query_devices())

{

    string serial = device.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);

    pipeline pipeline(context);

    config config;

    config.enable_device(serial);

    config.enable_stream(RS2_STREAM_COLOR, 1280, 720, RS2_FORMAT_BGR8, 15);

    config.enable_stream(RS2_STREAM_DEPTH, 1280, 720);

    config.enable_stream(RS2_STREAM_INFRARED, 1);

    pipeline.start(config);

    pipelines.emplace_back(pipeline);

    colorizers[serial] = colorizer();

}



map<int, frame> render_frames;



while(true)

{

    vector<Mat> mats;

    vector<frame> new_frames;

    for (auto && pipeline : pipelines)

    {

        frameset frameset = pipeline.wait_for_frames();

        if (frameset)

        {

            mats.push_back(frame_to_mat(frameset.get_color_frame()));

        }

    }

    Mat stitchedImage;

    Ptr<Stitcher> stitcher = Stitcher::create(Stitcher::PANORAMA);

    Stitcher::Status stitcherStatus = stitcher->stitch(mats, stitchedImage);

    if (stitcherStatus == Stitcher::OK)

    {

        imshow("Stitched Image", stitchedImage);
        auto k = waitKey(200);

    } else {

        cout << "Error stitching image.\n";

    }

}

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您忽略失真,则拼接只是计算从一个图像原点到另一个图像原点的变换。从技术上讲,您已经拥有了所需的一切。这是一种非常朴素的方法。

在每个单个摄像机(硬件规格中提供)中都有:

depth_origin -> rgb_origin
("->" represents a transform)

OpenCV缝合器可以在两个rgb图像之间estimate a transform,因此您拥有

cam1_rgb_origin -> cam2_rgb_origin

因此您可以计算:

cam1_depth -> cam1_rgb -> cam2_rgb -> cam2_depth   

您的方法有点不寻常,但由于realsense文档中提供了相机规格,并且我认为每个传感器都已很好地对齐,因此它可能会足够工作。

不过有一点警告:

通常,两个摄像机永远不会完美对齐。因此,对于更复杂的解决方案,我将避免使用通过图像拼接计算出的变换。我宁愿校准静态安装座上的摄像头以获得外部摄像头参数。那只是从摄像机坐标原点1到摄像机坐标原点2的3D变换。使用此变换,您可以在包含两个摄像机点的统一坐标系中创建传感器数据的3D点云。最后,您可以从所选的任何角度将此点云渲染为深度图像,并将rgb图像投影到该深度图像上,以使其可用于您想要使用的面部检测。相机校准可能会带来麻烦,尤其是当相机的视角没有太多相交时。因此,只有在您的结果不够用时,才应采用这种精心设计的方法。

对不起,但是出于时间考虑,我无法详细介绍。但我希望这能为您指明正确的方向。

答案 1 :(得分:0)

Intel SDK提供了单个相机的深度和RGB之间的旋转和平移矩阵。使用该矩阵可以对齐深度和rgb数据。

对于多相机,我们认为校准多台相机并不容易。英特尔建议使用“ vicalib”软件,您可以尝试一次。

相关问题