如何在点云库中将点云投影到地平面上并将其转换为2D图像(OpenCV Mat)?

8gsdolmq  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(546)

我想把地面上的石头分割开,像这样数出石头的面积:

我写了两年的OpenCV,发现仅仅使用OpenCV的RGB图片很难分割石头,所以我使用kinect融合技术扫描地面,得到石头高于地面的点云。
我使用“点云资源库”分割地平面(绿色),如下所示:

现在我正在尝试将剩下的点投影到地平面上,得到OpenCV Mat格式的2D图像(原始点的高度成为地面2D图像中投影点的值),结果是一张灰色的Mat图片。但这对我来说很困难,你能给予我一些建议吗?
如果我成功地得到我的新灰色垫,然后我可以做分割,这是相当容易的我。
顺便问一下,有没有一个点云查看器,我可以看到点的(x,y,z)坐标?
这是我的主要代码:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

pcl::io::loadPLYFile ("MeshedReconstruction.ply", *cloud);

pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers_groud (new pcl::PointIndices);
// Create the segmentation object
pcl::SACSegmentation<pcl::PointXYZ> seg;
// Optional
seg.setOptimizeCoefficients (true);
// Mandatory
seg.setModelType (pcl::SACMODEL_PLANE);
seg.setMethodType (pcl::SAC_RANSAC);
seg.setDistanceThreshold (0.01);//1cm

seg.setInputCloud (cloud);
seg.segment (*inliers_groud, *coefficients);

if (inliers_groud->indices.size () == 0)
{
    PCL_ERROR ("Could not estimate a planar model for the given dataset.");
    return (-1);
}

std::cerr << "Model coefficients: " << coefficients->values[0] << " " 
    << coefficients->values[1] << " "
    << coefficients->values[2] << " " 
    << coefficients->values[3] << std::endl;

std::cerr << "Model inliers_groud: " << inliers_groud->indices.size () << std::endl;

// Create the filtering object
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud (cloud);
extract.setIndices (inliers_groud);
extract.setNegative(false);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_groud (new pcl::PointCloud<pcl::PointXYZ>);

extract.filter (*cloud_groud);//get the ground plane

std::cerr << "Ground cloud after filtering: " << std::endl;
std::cerr << *cloud_groud << std::endl;

pcl::PCDWriter writer;
writer.write<pcl::PointXYZ> ("samp11-utm_ground.pcd", *cloud_groud, false);

我的答案:

请查看此PCL API:http://docs.pointclouds.org/1.7.2/a02405.html#ga4375e99ec2ae368eec9379f506568611
我成功地解决了这个问题!
结果很好(紫色平面是原始地面,绿色平面是转换后的地面,即X-O-Y平面):

现在,如果pcl::PointXYZ是(x 0,y 0,z 0),则Mat(x 0,y 0)上的点是z 0。结果:x1c4d 1x指令集

vqlkdk9b

vqlkdk9b1#

当您讨论将某物投影到地平面时,通常需要投影矩阵(K [R| t])。在您的情况下,如果我理解正确的话,您希望进行正交投影,这意味着您希望丢失Z坐标:http://en.wikipedia.org/wiki/Orthographic_projection
现在,你的方程是这样的

z_max = max z(Pts[x,y,z])
im[x,y] = z_max

请注意,您需要搜索云中给定x-y点的最大高度(Z)。
我希望这对你有帮助...

相关问题