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

efzxgjgh  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(160)

我有一个同时使用realsense 2和opencv 2库的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";

    }

}

谢谢你!

lhcgjxsq

lhcgjxsq1#

如果你忽略失真,那么拼接只是计算从一个图像原点到另一个原点的变换。从技术上讲,你已经拥有了你所需要的一切。这里有一个非常幼稚的方法。
每个摄像机(在硬件规格中提供)内有:

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

OpenCV拼接器可以估计两个rgb图像之间的变换,

cam1_rgb_origin -> cam2_rgb_origin

因此,您可以计算:

cam1_depth -> cam1_rgb -> cam2_rgb -> cam2_depth

你的方法有点不寻常,但它可能足够工作,因为相机规格提供在realsense文档,我认为每个传感器都很好地对齐。

但有一点警告

一般来说,两台摄像机永远不会完全对齐。因此,对于更复杂的解决方案,我会避免使用通过图像拼接计算的变换。我宁愿校准静态支架上的摄像机,以获得外部摄像机参数。这只是从摄像机坐标原点1到摄像机坐标原点2的3D变换。使用此变换,您可以“d在一个包含两个摄像头的点的统一坐标系中创建一个传感器数据的3D点云。最后,您可以从您选择的任何视角将此点云渲染为深度图像,并将rgb图像投影到其上,使其适用于您想要使用的人脸检测。相机校准可能是一个皇家的痛苦,特别是当相机的视角不相交很多。所以只有当你的结果不足以满足时,才遵循这个精心设计的方法。
抱歉,由于时间关系,我不能透露更多细节,但我希望这能为你指明正确的方向。

tcbh2hod

tcbh2hod2#

英特尔SDK提供单个摄像头的深度和RGB之间的旋转和转换矩阵。使用该矩阵,您可以对齐深度和RGB数据。
对于多摄像头,校准多个摄像头并不像我们想象的那么容易。英特尔建议使用“vicalib”软件,您可以尝试一次。

相关问题