我一直在尝试从一对校正后的立体图像中生成点云。我首先使用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

最佳答案

我对这种语言不满意,但是我注意到了一个问题:
假设这条线将disparty转换为深度(Z)

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

什么是0.01?如果此计算为您提供了从1到10的深度(Z)范围,则此系数会将您的范围从0.01减小到0.1。深度始终接近于零,您将获得一个平面图像(平面图像=恒定深度)。

PS我在您的代码中看不到从具有Z值的u,v像素值进行X,Y转换。就像是
X = u*Z/f

关于opencv - 从视差图获取平面点云,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41517429/

10-11 16:02