首页 文章

从视差图中获取平面点 Cloud

提问于
浏览
2

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

[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转换的差异是正确的还是差异值的问题?

我已经包含了视差图,点 Cloud 和原始左图的截图 .

谢谢!

screenshot

1 回答

  • 0

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

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

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

    PS我没有看到你的代码X,Y转换为u,v像素值为Z值 . 就像是

    X = u*Z/f
    

相关问题