gpt4 book ai didi

object - 从 PointCloud 创建蒙版 (cv::Mat) 以从使用 kinect 观察到的场景中提取对象

转载 作者:行者123 更新时间:2023-12-02 17:50:21 26 4
gpt4 key购买 nike

我正在尝试使用 opencv 实现一些对象识别。到目前为止,我只使用记录的数据,场景中没有任何令人不安的东西,这让我可以专注于使用 opencv 进行识别部分。
现在我意识到,这通常不适用于真实场景。我想让我的算法适用于一个场景,我将一个(单个)对象放在地板上或相机前面的 table 上,然后创建一个蒙版(cv::Mat),它允许我消除所有内容,但 table /地板上的主题。

因此,我刚刚开始查看点云库。但是,我不确定如何做到这一点或最好的方法是什么。我想在 Kinect 相机的点云上使用平面分割算法,然后移除平面,只留下物体的云。之后,我计划从角点(最外点)读取 x 和 y 坐标,以使用 opencv 创建掩码对象。
这行得通吗?任何更好的想法或者可能是可行解决方案的来源/示例?

感谢您的帮助!

...
问题是,在分割之后,点云不再被组织起来,我没有设法通过使用以下方法读出云中点的(预期的)x,y坐标:

 for (size_t i = 0; i < (cloud)->points.size(); ++i)
{
std::cout << "PointCloud x: " << cloud->points[i].x << std::endl;
std::cout << "PointCloud y: " << cloud->points[i].y << std::endl;
std::cout << "PointCloud z: " << cloud->points[i].z << std::endl;
}

这给了我一些我不知道如何解释的浮点数。我为这个愚蠢的问题道歉,但这个数字说明了什么?如何获得 int 坐标?

谢谢

最佳答案

假设您的对象识别算法是固定的,以下是在平面上方分割对象的典型方法。在您的情况下,我建议您在原始云中维护一组索引,以便您可以在最后轻松创建蒙版;点云库通常提供此功能(或者,您可以忘记跟踪索引,并且一旦获得对象的最终点云,使用最近邻搜索来查找原始索引 - 效率较低)。

步骤:

  • 平面查找以查找和提取平面。

    http://pointclouds.org/documentation/tutorials/planar_segmentation.php#planar-segmentation
    http://pointclouds.org/documentation/tutorials/extract_indices.php#extract-indices
  • 去除噪音:

    http://pointclouds.org/documentation/tutorials/statistical_outlier.php#statistical-outlier-removal
  • 移除平面后,欧几里得聚类在场景中找到对象:

    http://pointclouds.org/documentation/tutorials/cluster_extraction.php#cluster-extraction

  • 完成此操作后,您将获得分割对象中原始云的一组点索引。请注意,原始云将被组织,因此很容易获得每个点的列/行。现在你可以用它来创建一个蒙版,可能做一些膨胀(腐 eclipse )来消除噪音。

    更多信息:
    http://www.pointclouds.org/assets/iros2011/segmentation.pdf

    注意:如果您不必使用单独的分割和识别步骤来执行此操作,则有许多算法可以同时执行它们,其中之一是 PCL 和 OpenCV 中的 LINEMOD。

    编辑

    您已经写道,在查找原始组织点云的索引时需要帮助。

    我写道有两种方法可以做到这一点 - 将每个步骤的输出作为点获取并搜索原始云以查找索引或仅在每个步骤处理索引。第三种选择是利用那些已经实现的算法来让云变得井井有条(我不确定哪些算法提供了这个选项)。让我们处理第二个选项。

    如果您查看上面使用的类 pcl::SACSegmentation、pcl::StatisticalOutlierRemoval 和 pcl::EuclideanClusterExtraction 的文档,您会看到有一些工具可以在输入上设置索引。这类似于在 OpenCV 中设置掩码。这通常是对伴随 .setInputCloud() 的函数 .setIndices() 的调用。同样,如果您希望算法输出一组索引而不是新的云,您可以传递一个要填充的索引对象(这是 std::vector 或 pcl::PointIndices 几乎相同的东西 - 检查结构定义)。

    因此,如果您只是通过管道使用原始点云传递索引,您可以在最后获得一组索引。要将这些索引转换为掩码,您可以从每个索引计算 x 和 y 值(据我所知,有组织的点云被打包在具有行主要的二维中,因此这是整数除以宽度以获得 y 和按宽度取整数模得到 x)。

    http://pointclouds.org/documentation/tutorials/basic_structures.php#basic-structures

    关于object - 从 PointCloud 创建蒙版 (cv::Mat) 以从使用 kinect 观察到的场景中提取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23328983/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com