【问题标题】:Getting flat point cloud from disparity map从视差图中获取平面点云
【发布时间】:2017-05-21 21:48:16
【问题描述】:

我一直在尝试从一对经过校正的立体图像生成点云。我首先使用opencv的sgbm实现获得了视差图。然后我使用以下代码将其转换为点云,

[for (int u=0; u < left.rows; ++u)
                {
                        for (int v=0; v < left.cols; ++v)
                        {
                                if(disp.at<int>(u,v)==0)continue;
                                pcl::PointXYZRGB p;
                                p.x = v;
                                p.y = u;
                                p.z = (left_focalLength * baseLine * 0.01/ disp.at<int>(u,v));
                                std::cout << p.z << std::endl;
                                cv::Vec3b bgr(left.at<cv::Vec3b>(u,v));
                                p.b = bgr\[0\];
                                p.g = bgr\[1\];
                                p.r = bgr\[2\];
                                pc.push_back(p);
                        }
                }][1]

left为左图,disp为cv_16s中的输出视差图。 我对 pcl 转换的差异是正确的还是差异值有问题?

我已经包含了视差图、点云和原始左侧图像的屏幕截图。

谢谢!

screenshot

【问题讨论】:

    标签: opencv point-cloud-library point-clouds printer-control-language


    【解决方案1】:

    我对这种语言没有信心,但我注意到一件事:
    假设这条线将 disparty 转换为深度 (Z)

    p.z = (left_focalLength * baseLine * 0.01/ disp.at<int>(u,v));
    

    什么是 0.01?如果此计算为您提供从 1 到 10 的深度 (Z) 范围,则此因素会将您的范围从 0.01 减少到 0.1。深度总是接近于零,你有一个平面图像(平面图像 = 恒定深度)。

    PS 我在您的代码中没有看到从 u,v 像素值与 Z 值的 X,Y 转换。像

    X = u*Z/f
    

    【讨论】:

    • 感谢您的回复,0.01 用于将焦距和基线值转换为厘米。我使用了 opencv 函数calibrationMatrixValues,它从相机固有矩阵中以毫米为单位输出这些值。但是,我现在正在使用 opencv 的 reprojectImageTo3D 函数来进行深度视差映射,并且我得到了 3D 结果,但它仍然严重缺乏 - drive.google.com/file/d/0B_2Iwz6JbA4pVi0tWVEyUFc1Tlk/…
    • @KarnikRam 我想知道另一个(可能是愚蠢的)细节:你知道 sgbm 算法提供的视差值大 16 倍吗? (你必须除以 16 才能得到真正的值)
    • 是的 :) 你可以在这里找到我的完整代码 - drive.google.com/file/d/0B_2Iwz6JbA4pSHV0TVR2TG9INk0/… ;您可以忽略 LoadMetadata 和 LoadCalibration 函数。
    • @KarnikRam 我不习惯 C++ 但如果这两行是后续的,computeDisparity(left, right, disp);cv::reprojectImageTo3D(disp, xyz, Q, false, CV_32F); 你将 disp 除以 16? (我看到您将 disp8 从 0 缩放到 255,但这是另一回事。您在 3d 重建中使用了 disp)。
    • 嗨,我也确实使用 disp8 来进行 computeDisparity。没有变化。
    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 2015-06-11
    • 2014-05-27
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多