[python][pcl]python-pcl案例之为平面模型构造凹凸外壳多边形

这篇具有很好参考价值的文章主要介绍了[python][pcl]python-pcl案例之为平面模型构造凹凸外壳多边形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试环境:

pcl==1.12.1

python-pcl==0.3.1

python==3.7

代码:

# -*- coding: utf-8 -*-
# Construct a concave or convex hull polygon for a plane model
# http://pointclouds.org/documentation/tutorials/hull_2d.php#hull-2d

import numpy as np
import pcl
import random


def main():
    #  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>),
    #                                      cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>),
    #                                      cloud_projected (new pcl::PointCloud<pcl::PointXYZ>);
    # cloud = pcl.PointCloud()
    # cloud_filtered = pcl.PointCloud()
    # cloud_projected = pcl.PointCloud()

    #  pcl::PCDReader reader;
    #  reader.read ("table_scene_mug_stereo_textured.pcd", *cloud);
    cloud = pcl.load(
        r"C:\Users\Administrator\Desktop\python-pcl\examples\pcldata\tutorials\table_scene_mug_stereo_textured.pcd")

    # // Build a filter to remove spurious NaNs
    # pcl::PassThrough<pcl::PointXYZ> pass;
    # pass.setInputCloud (cloud);
    # pass.setFilterFieldName ("z");
    # pass.setFilterLimits (0, 1.1);
    # pass.filter (*cloud_filtered);
    # std::cerr << "PointCloud after filtering has: "
    #           << cloud_filtered->points.size () << " data points." << std::endl;
    passthrough = cloud.make_passthrough_filter()
    passthrough.set_filter_field_name("z")
    passthrough.set_filter_limits(0.0, 1.1)
    cloud_filtered = passthrough.filter()
    print('PointCloud after filtering has: ' +
          str(cloud_filtered.size) + ' data points.')

    # pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
    # pcl::PointIndices::Ptr inliers (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);
    # seg.setInputCloud (cloud_filtered);
    # seg.segment (*inliers, *coefficients);
    # std::cerr << "PointCloud after segmentation has: "
    #           << inliers->indices.size () << " inliers." << std::endl;
    seg = cloud_filtered.make_segmenter_normals(ksearch=50)
    seg.set_optimize_coefficients(True)
    seg.set_model_type(pcl.SACMODEL_NORMAL_PLANE)
    seg.set_method_type(pcl.SAC_RANSAC)
    seg.set_distance_threshold(0.01)
    indices, model = seg.segment()

    print('PointCloud after segmentation has: ' +
          str(indices.count) + ' inliers.')

    #   // Project the model inliers
    #   pcl::ProjectInliers<pcl::PointXYZ> proj;
    #   proj.setModelType (pcl::SACMODEL_PLANE);
    #   proj.setIndices (inliers);
    #   proj.setInputCloud (cloud_filtered);
    #   proj.setModelCoefficients (coefficients);
    #   proj.filter (*cloud_projected);
    #   std::cerr << "PointCloud after projection has: "
    #             << cloud_projected->points.size () << " data points." << std::endl;
    proj = cloud_filtered.make_ProjectInliers()
    proj.set_model_type(pcl.SACMODEL_PLANE)
    #   proj.setIndices (inliers);
    #   proj.setModelCoefficients (coefficients)
    cloud_projected = proj.filter()

    print('PointCloud after projection has: ' +
          str(cloud_projected.size) + ' data points.')

    #   // Create a Concave Hull representation of the projected inliers
    #   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull (new pcl::PointCloud<pcl::PointXYZ>);
    #   pcl::ConcaveHull<pcl::PointXYZ> chull;
    #   chull.setInputCloud (cloud_projected);
    #   chull.setAlpha (0.1);
    #   chull.reconstruct (*cloud_hull);
    #   std::cerr << "Concave hull has: " << cloud_hull->points.size ()
    #             << " data points." << std::endl;
    # cloud_projected = pcl.PointCloud()
    chull = cloud_projected.make_ConcaveHull()
    chull.set_Alpha(0.1)
    cloud_hull = chull.reconstruct()
    print('Concave hull has: ' + str(cloud_hull.size) + ' data points.')

    #   pcl::PCDWriter writer;
    #   writer.write ("table_scene_mug_stereo_textured_hull.pcd", *cloud_hull, false);

    if cloud_hull.size != 0:
        pcl.save(cloud_hull, 'table_scene_mug_stereo_textured_hull.pcd')


if __name__ == "__main__":
    # import cProfile
    # cProfile.run('main()', sort='time')
    main()

运行结果:

PointCloud after filtering has: 139656 data points.
PointCloud after segmentation has: <built-in method count of list object at 0x0000028CA3429A48> inliers.
PointCloud after projection has: 139656 data points.
Concave hull has: 281 data points.

table_scene_mug_stereo_textured.pcd文件需要去这个地址下载:

https://github.com/strawlab/python-pcl/blob/master/examples/pcldata/tutorials/table_scene_mug_stereo_textured.pcd文章来源地址https://www.toymoban.com/news/detail-514970.html

到了这里,关于[python][pcl]python-pcl案例之为平面模型构造凹凸外壳多边形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【点云】生成有凹凸的平面

    尝试用一些数据生成有凹凸面的点云。 我们姑且把z轴当成有凹凸的缺陷,x轴和y轴共同组成一个平面。 高斯函数wiki中,我们得知 其中,σ为标准差,用来控制“钟形”的宽度。 根据wiki中下面的举例 sigma_X = 1;sigma_Y = 2; 可以看出,σx=σy时,高斯的水平集是个圆,σx不等于σ

    2024年02月19日
    浏览(33)
  • OpenGL ES入门教程(三)之为平面桌子添加混合色

    上一篇文章我们讲解了OpenGL ES如何绘制一个平面桌子,本文在其基础上继续讲解如何使绘制的平面桌子具有混合色,效果类似在桌子中心上面吊一盏灯,越靠近桌子中心颜色越亮白,越远离桌子中心颜色越暗灰。如果是OpenGL ES小白,在阅读本篇文章之前一定要搞懂上篇文章

    2024年02月05日
    浏览(27)
  • 3D点云处理:圆柱侧面点云展开为平面 凹凸缺陷检测(附源码)

    订阅说明:如果要订阅,先看链接内容 看链接内容 看链接内容:订阅先看此内容 文章目录: 3D视觉个人学习目录 目标:对采集的圆柱面点云展开为平面; 应用:可用于检测圆柱侧面的凹凸缺陷;       圆柱的侧面展开原理是将一个圆柱体(或柱体)的侧面展开成一个矩

    2024年02月09日
    浏览(100)
  • Matlab 最小二乘法 拟合平面 (PCL PCA拟合平面)

    最小二乘法 拟合平面是我们最常用的拟合平面的方法,但是有特殊的情况是用这种方法是不能拟合的,后续会加上这种拟合方法(RANSAC)。 matlab 最小二乘拟合平面(方法一) - 灰信网(软件开发博客聚合) 平面方程:Ax+By+Cz+D=0;   1、随机出来一些离散的点    2、将其写成

    2024年02月16日
    浏览(32)
  • PCL RANSAC拟合平面(C++详细过程版)

    本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。   RANSAC拟合平面,采用的是不共线的三个点确定一个平面,据以实现原理见:PCL 三点确定一个平面原理及代码

    2024年02月13日
    浏览(29)
  • PCL 点云投影到平面(C++详细过程版)

      点云投影到平面在PCL里有现成的调用函数,具体算法原理和实现代码见:PCL 点云投影到拟合平面。为充分了解点云投影到平面实现的每一个细节和有待改进的地方,使用C++代码对算法实现过程进行复现。

    2024年02月02日
    浏览(46)
  • PCL 计算一个平面与一个三角形的交线

    这里实现一个很有趣的功能,就是获取一个平面与一个三角形的交线,具体的思路很简单,就是借助之前的博客中的思路:Matlab 计算一个平面与一条线段的交点,我们只需要遍历三角形中的所有边即可获取我们想要的交线,这里是PCL版本。

    2024年02月06日
    浏览(32)
  • PCL 建筑物点云立面和平面分割提取

      在建筑物点云中,立面点和平面点的法向量存在明显的差异,根据法向量在Z方向的分量设置相应得阈值即可实现立面点与平面点的分割。

    2024年02月06日
    浏览(28)
  • pcl matlab 计算平面与空间三角形的交线

     过程: 单有法向量不能确定一个平面,至少还要有平面上的一个点的坐标才行 假如知道法向量n=(A,B,C) 而平面过某点M=(x0,y0,z0) 那么平面的方程为 A(x-x0)+B(y-y0)+C(z-z0)=0 要在图中画出来,那么先要给x,y一个范围 举个离子,平面法向量(1,1,1)过点(0,1,2) 画出x,y在 -2~2区

    2024年02月12日
    浏览(36)
  • 大数据分析案例-基于XGBoost算法构造房屋租赁价格评估模型

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

    2023年04月19日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包