精华内容
下载资源
问答
  • MATLAB绘制圆柱体

    千次阅读 2021-01-20 17:31:10
    MATLAB绘制圆柱体1. 效果展示2. 代码汇总3. 函数调用4 多多点赞交流 1. 效果展示 例1. 绘制一个原点在(5,2,1),半径13,高度14的圆柱体: 通过调整坐标轴,可以做出比例适当的图片,如下: 2. 代码汇总 ...

    1. 效果展示

    例1. 绘制一个原点在(5,2,1),半径13,高度14的圆柱体:
    在这里插入图片描述

    通过调整坐标轴,可以做出比例适当的图片,如下:
    在这里插入图片描述

    2. 代码汇总

    function PlotCylinder(originPoint,cylinderRadius,cylinderHeight)
    %% 函数功能: 绘制圆柱体
    % 输入:
    %       originPoint:圆柱体的原点,行向量,如[0,0,0];
    %       cylinderRadius:圆柱体的半径;
    %       cylinderHeight:圆柱体的高度
    % 输出:圆柱体图形
    
    %% 根据半径生成圆柱体的基础三维坐标点,100指的是用100个点拟合底面和顶圆
    [xOrigin,yOrigin,zOrigin]=cylinder(cylinderRadius,100);
    
    %% 根据高度确定z的坐标,相当于缩放圆柱的高度
    zOrigin=zOrigin*cylinderHeight;
    
    %% 根据圆柱的原点平移各个坐标点
    x=xOrigin+originPoint(1);
    y=yOrigin+originPoint(2);
    z=zOrigin+originPoint(3);
    
    %% 绘制并展示图像
    % 这里的color指定绘制的面的颜色,只要维度与z相同即可,可以缺省
    color=x+y+z;
    surf(x,y,z,color,'FaceAlpha',0.5);
    xlabel('X');
    ylabel('Y');
    zlabel('Z');
    title('Cylinder');
    fig=gcf;
    fig.Color=[1 1 1];
    fig.Name='cylinder';
    fig.NumberTitle='off';
    

    文件自行取用:PlotCylinder.m
    提取码:pr8f

    注释应该都比较清楚,有疑问可留步评论区

    3. 函数调用

    调用方法很简单,第一个参数是圆柱体的原点,第二个是底面圆半径,第三个是圆柱体高度,输入命令:

    PlotCylinder([5,2,0],13,14)
    

    回车运行即可得到例1中的结果。
    在这里插入图片描述

    4 多多点赞交流

    展开全文
  • 本文提出了一种基于局部透视变换的图像矫正算法,将圆柱体侧表面PDF417条码分割为若干子区域,然后对各个子区域分别进行透视变换,将各个子区域分别矫正之后再行拼接,最后得到平面PDF417条码的图像。实验结果表明,该...
  • 对于球形和圆柱形对称四边形的情况,我们找到了f(T)远平行重力的精确解... 之后,我们获得了一般圆柱对称四边形的Jordan框架Lagrangian。 按照在球对称情况下采用的相同步骤,我们再次获得四极电位,然后获得精确解。
  • opengl空间画圆柱体

    2013-09-04 12:00:00
    介绍:由于opengl库里并没有函数直接在三维空间绘制圆柱形的函数,所以需要用一种方法来实现在三维空间绘制圆柱体。 基本思路: 要在空间AB两点间绘制一个圆柱体,可以先在y轴上画一个同等长度的圆柱,然后旋转平移...

    介绍:由于opengl库里并没有函数直接在三维空间绘制圆柱形的函数,所以需要用一种方法来实现在三维空间绘制圆柱体。

    基本思路 : 要在空间AB两点间绘制一个圆柱体,可以先在y轴上画一个同等长度的圆柱,然后旋转平移到AB就可以了。

     

    void cyLinder(float x0,float y0,float z0,float x1,float y1,float z1){   //如果要在AB两点间画一个圆柱体,其可以
                                                  //先在y轴上画一个同长度的圆柱,然后
                                                  //求出旋转矩阵,将其移至AB
     GLdouble dir_x=x1-x0,

        dir_y=y1-y0,

        dir_z=z1-z0;

     GLdouble cy_length=sqrt(dir_x*dir_x+dir_y*dir_y+dir_z*dir_z);    //获得圆柱的长度
     
     static GLUquadricObj* quad_obj=NULL;

     if(quad_obj==NULL)

      quad_obj=gluNewQuadric();

     gluQuadricDrawStyle(quad_obj,GLU_FILL); 
     
     gluQuadricNormals(quad_obj,GLU_SMOOTH);
     
     glPushMatrix();                          //将当前矩阵压入矩阵堆栈
     
     glTranslated(x0,y0,z0);                    //平移到起点,即A点


     //获得AB的长度
     double length;

     length=sqrt(dir_x*dir_x+dir_y*dir_y+dir_z*dir_z);

     dir_x/=length;dir_y/=length;dir_z/=length; 
     
     GLdouble up_x=0.0,

        up_y=1.0,

        up_z=0.0;

     GLdouble side_x,side_y,side_z;

     //实现向量的叉乘
     side_x=up_y*dir_z-up_z*dir_y;
     
     side_y=up_z*dir_x-up_x*dir_z;
     
     side_z=up_x*dir_y-up_y*dir_x;
     
     length=sqrt(dir_x*dir_x+dir_y*dir_y+dir_z*dir_z);
     

     side_x/=length;side_y/=length;side_z/=length;

     up_x=dir_y*side_z-dir_z*side_y; 

     up_y=dir_z*side_x-dir_x*side_z;
     
     up_z=dir_x*side_y-dir_y*side_x; 
     

     //得到变换矩阵
     GLdouble m[]={side_x,side_y,side_z,0.0,

      up_x,up_y,up_z,0.0,

      dir_x,dir_y,dir_z,0.0,

      0.0,0.0,0.0,1.0};


     glMultMatrixd(m);                //用m矩阵乘以当前矩阵

     
     GLdouble radius=0.5;      //这些参数可以自己设置

     GLdouble slices=8.0;

     GLdouble stack=3.0;
     
     gluCylinder(quad_obj,radius,radius,cy_length,slices,stack);

     glPopMatrix();
    }

    转载于:https://www.cnblogs.com/xiaoaiyi/p/3300725.html

    展开全文
  • Matlab 绘制空间任意方向圆柱体

    千次阅读 2020-12-19 15:50:40
    Matlab 绘制空间任意方向圆柱体 一 系统函数 Matlab本身自带了绘制圆柱体函数,如下: [X,Y,Z] = cylinder [X,Y,Z] = cylinder(r) [X,Y,Z] = cylinder(r,n) cylinder(axes_handle,...) cylinder(...) 说明: ...

    Matlab 绘制空间任意方向圆柱体

    一 系统函数

    Matlab本身自带了绘制圆柱体函数,如下:

    [X,Y,Z] = cylinder
    [X,Y,Z] = cylinder(r)
    [X,Y,Z] = cylinder(r,n)
    cylinder(axes_handle,...)
    cylinder(...)
    

    说明

    • cylinder 生成单位圆柱的 x、y 和 z 坐标。可使用 surf 或 mesh 绘制圆柱形对象,或不提供输出参数直接绘制它。
    • [X,Y,Z] = cylinder 返回半径等于 1 的圆柱的 x、y 和 z 坐标。该圆柱绕其周长有 20 个等距点。
    • [X,Y,Z] = cylinder® 使用 r 定义剖面曲线以返回圆柱的 x、y 和 z 坐标。cylinder 将 r 中的每个元素视为沿圆柱单位高度的等距高度的半径。该圆柱绕其周长有 20 个等距点。
    • [X,Y,Z] = cylinder(r,n) 基于向量 r 定义的剖面曲线返回圆柱的 x、y 和 z 坐标。该圆柱绕其周长有 n 个等距点。
    • cylinder(axes_handle,…) 将图形绘制到带有句柄 axes_handle 的坐标区中,而不是当前坐标区 (gca) 中。
    • 不带任何输出参数的 cylinder(…) 使用 surf 绘制圆柱。

    (备注:以上来源于Matlab帮助文档)

    可见系统自带函数只能生成垂直于XY平面的圆柱体,要想绘制任意方向的圆柱体则需要在此基础上写程序实现。

    二 由空间任意两点绘制空间圆柱体

    方法一

    1. 思路:首先由系统自带函数cylinder生成标准圆柱体,该圆柱体轴线垂直于XY平面,底面原点位于坐标系原点,半径为r,高度为1。然后在此基础上通过旋转、拉伸变换得到想要的任意方向的圆柱体。
    2. 实现:
      首先将cylinder生成的圆柱体坐标的z坐标扩大L=norm(u1-u2)倍,然后将x,y,z坐标绕坐标y轴旋转angle(z),再将x,y,z坐标绕坐标z轴旋转angle(x),得到最终的圆柱体坐标,最后用surf进行绘制。
    3. 代码

    以下代码转至:https://blog.csdn.net/wushang_1314/article/details/91147550

    function plotcylinder(u1,u2,color_a,r,alpha)
    % 根据空间两点画圆柱
    % u1,u2 ——空间两点
    % color ——颜色
    % r     ——半决
    % alpha ——透明度
    
    L=norm(u1-u2);
    ROD=u2-u1;
    [X,Y,Z]=cylinder(r,100);
    x1=X*0;y1=Y*0;z1=Z*0;
    Z=L*Z-L/2;
    ROD_midpoint=(u1+u2)/2;
    x=ROD_midpoint(1);
    y=ROD_midpoint(2);
    z=ROD_midpoint(3);
    a=[1 0 0];b=[0 1 0];c=[0 0 1];
    if(ROD(2)==0||ROD(1)==0)
        if(ROD(2)==0)    % 在XZ平面
           angel=acos(dot(ROD,c)/norm(ROD)/norm(c));
           if(ROD(1)<0)
               angel=-angel;  %%
           end
           A2=[cos(angel) 0 sin(angel);0 1 0; -sin(angel) 0 cos(angel)];  % 绕Y轴旋转
           for i=1:length(X(1,:))
              u=[X(1,i) Y(1,i) Z(1,i)]';
              u1=A2*u;
              x1(1,i)=u1(1);y1(1,i)=u1(2);z1(1,i)=u1(3);
              u=[X(1,i) Y(1,i) Z(2,i)]';
              u1=A2*u;
              x1(2,i)=u1(1);y1(2,i)=u1(2);z1(2,i)=u1(3);   
           end    
        end
        if(ROD(1)==0)   % 在YZ平面
           angel=acos(dot(ROD,c)/norm(ROD)/norm(c));
           angel=2*pi-angel;   % 此处maybe要增加类似上面的判定是否变为负数
           A1=[1 0 0;0 cos(angel) -sin(angel);0 sin(angel) cos(angel)];  % 绕X轴旋转
           for i=1:length(X(1,:))
              u=[X(1,i) Y(1,i) Z(1,i)]';
              u1=A1*u;
              x1(1,i)=u1(1);y1(1,i)=u1(2);z1(1,i)=u1(3);
              u=[X(1,i) Y(1,i) Z(2,i)]';
              u1=A1*u;
              x1(2,i)=u1(1);y1(2,i)=u1(2);z1(2,i)=u1(3);   
           end      
        end
    else
         % 先绕Z轴旋转,在绕Y轴旋转
           angel=acos(dot(ROD,c)/norm(ROD)/norm(c));
           A2=[cos(angel) 0 sin(angel);0 1 0; -sin(angel) 0 cos(angel)];
           angel=acos(dot(ROD,a)/norm(ROD)/norm(a));
           if(ROD(2)<0)
               angel=2*pi-angel;
           end
           A3=[cos(angel) -sin(angel) 0;sin(angel) cos(angel) 0;0 0 1];
           A=A3*A2;
           for i=1:length(X(1,:))
              u=[X(1,i) Y(1,i) Z(1,i)]';
              u1=A*u;
              x1(1,i)=u1(1);y1(1,i)=u1(2);z1(1,i)=u1(3);
              u=[X(1,i) Y(1,i) Z(2,i)]';
              u1=A*u;
              x1(2,i)=u1(1);y1(2,i)=u1(2);z1(2,i)=u1(3);   
           end
    end
    fill3(x1(1,:)+x,y1(1,:)+y,z1(1,:)+z,color_a,'EdgeColor','none','FaceAlpha',alpha) %底面
    hold on
    fill3(x1(2,:)+x,y1(2,:)+y,z1(2,:)+z,color_a,'EdgeColor','none','FaceAlpha',alpha) %顶面
    hold on
    surf(x1+x,y1+y,z1+z,'facecolor',color_a,'edgecolor','none','FaceAlpha',alpha)    %圆柱表面
    % axis equal
    % xlabel('x')
    % ylabel('y')
    % zlabel('z')
    set(gcf,'color','w')  %gcf是当前图窗的句柄,用图窗句柄可查询和修改图窗属性
    
    1. 缺陷
      但是笔者在使用过程中发现某些情况会出错,如下:
      在这里插入图片描述

    方法二

    通过观察[X,Y,Z] = cylinder(r,n)生成的圆柱体数据类型时发现,X,Y,Z均为一个2行n列的矩阵,用于存储圆柱底面和顶面两个圆的空间数据点,然后通过surf(X,Y,Z,'facecolor',color,'edgecolor','none','FaceAlpha',alpha) 进行绘制。
    即只需求出空间圆柱底面与顶面圆的方程即可绘制圆柱体,具体方法如下:

    1. 思路:
      已知空间两点,即可分别求出两个圆的方程,通过空间一点与法向即可求出空间圆的方程,方法可由以下博客得出: http://blog.sina.com.cn/s/blog_6496e38e0102vi7e.html
      在这里插入图片描述
    2. 实现:
    function myplotcylinder(u1,u2,color,r,alpha)
    % 根据空间两点画圆柱
    % u1,u2 ——空间两点
    % color ——颜色
    % r     ——半径
    % alpha ——透明度
    
    n=u2-u1;
    theta=(0:2*pi/100:2*pi)'; %theta角从0到2*pi
    a=cross(n,[1 0 0]);       %n与i叉乘,求取a向量
    if ~any(a) %如果a为零向量,将n与j叉乘   %any检测矩阵中是否有非零元素,如果有,则返回1,否则,返回0
        a=cross(n,[0 1 0]);
    end
    b=cross(n,a); %求取b向量
    a=a/norm(a);  %单位化a向量
    b=b/norm(b);  %单位化b向量
    %a,b是满足既垂直于n,又互相垂直的任意单位向量
    
    %底面圆方程
    c1=u1(1)*ones(size(theta,1),1);
    c2=u1(2)*ones(size(theta,1),1);
    c3=u1(3)*ones(size(theta,1),1);
    x1=c1+r*a(1)*cos(theta)+r*b(1)*sin(theta); %圆上各点的x坐标
    y1=c2+r*a(2)*cos(theta)+r*b(2)*sin(theta); %圆上各点的y坐标
    z1=c3+r*a(3)*cos(theta)+r*b(3)*sin(theta); %圆上各点的z坐标
    
    %顶面圆方程
    c1=u2(1)*ones(size(theta,1),1);
    c2=u2(2)*ones(size(theta,1),1);
    c3=u2(3)*ones(size(theta,1),1);
    x2=c1+r*a(1)*cos(theta)+r*b(1)*sin(theta); %圆上各点的x坐标
    y2=c2+r*a(2)*cos(theta)+r*b(2)*sin(theta); %圆上各点的y坐标
    z2=c3+r*a(3)*cos(theta)+r*b(3)*sin(theta); %圆上各点的z坐标
    
    X(1,:)=x1(:);
    X(2,:)=x2(:);
    Y(1,:)=y1(:);
    Y(2,:)=y2(:);
    Z(1,:)=z1(:);
    Z(2,:)=z2(:);
    
    fill3(X(1,:),Y(1,:),Z(1,:),color,'EdgeColor','none','FaceAlpha',alpha) %底面
    hold on
    fill3(X(2,:),Y(2,:),Z(2,:),color,'EdgeColor','none','FaceAlpha',alpha) %顶面
    hold on
    surf(X,Y,Z,'facecolor',color,'edgecolor','none','FaceAlpha',alpha)    %圆柱表面
    

    在这里插入图片描述

    <完>

    后记:笔者才疏学浅,如有错误,望指出。

    展开全文
  • 点云分割——圆柱体分割

    千次阅读 2019-04-01 09:25:22
    此例利用随机采样一致性算法对有噪声的点云场景提取一个圆柱体模型,处理流程如下: (1)过滤掉远与1.5m的数据点 (2)计算每个点的表面法线 (3)分割出平面模型(本例中为桌面)并保存到磁盘中 (4)分割出...

    此例利用随机采样一致性算法对有噪声的点云场景提取一个圆柱体模型,处理流程如下:

    (1)过滤掉远与1.5m的数据点

    (2)计算每个点的表面法线

    (3)分割出平面模型(本例中为桌面)并保存到磁盘中

    (4)分割出圆柱体模型并保存到磁盘中

     

    PCL法线估计:

        平面的法线是垂直于它的单位向量。在点云的表面的法线被定义为垂直于与点云表面相切的平面的向量。表面法线也可以计算点云中一点的法线,被认为是一种十分重要的性质。常常在被使用在很多计算机视觉的应用里面,比如可以用来推出光源的位置,通过阴影与其他视觉影响,表面法线的问题可以近似化解为切面的问题,这个切面的问题又会变成最小二乘法拟合平面的问题。

        解决表面法线估计的问题可以最终化简为对一个协方差矩阵的特征向量和特征值的分析(或者也叫PCA-Principal Component Analysis 主成分分析),这个协方差矩阵是由查询点的最近邻产生的。对于每个点Pi,我们假设协方差矩阵C如下:

    C++中声明对象和NEW对象的区别:

        new出来的对象是直接放在堆上,而声明一个对象是放在栈中。换句话说,new出来的对象的生命周期是全局的,譬如在一个函数块里new一个对象,可以将该对象的指针返回回去,该对象依旧存在。而声明的对象的生命周期只存在于声明了该对象的函数块中,如果返回该声明的对象,将会返回一个已经被销毁的对象。

    参考博客:https://blog.csdn.net/city_to_sky/article/details/79876992

     

    FPS每秒纯属帧率(Frames Per Second):

        FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的动作就会越流畅。通常,要避免动作不流畅的最低是30。某些计算机视频格式,每秒只能提供15帧。

    FPS”也可以理解为我们常说的“刷新率(单位为Hz)”,例如我们常在CS游戏里说的“FPS值”。我们在装机选购显卡和显示器的时候,都会注意到“刷新率”。一般我们设置缺省刷新率都在75Hz(即75帧/秒)以上。例如:75Hz的刷新率刷也就是指屏幕一秒内只扫描75次,即75帧/秒。而当刷新率太低时我们肉眼都能感觉到屏幕的闪烁,不连贯,对图像显示效果和视觉感观产生不好的影响。

    电影以每秒24张画面的速度播放,也就是一秒钟内在屏幕上连续投射出24张静止画面。有关动画播放速度的单位是fps,其中的f就是英文单词Frame(画面、帧),p就是Per(每),s就是Second(秒)。用中文表达就是多少帧每秒,或每秒多少帧。电影是24fps,通常简称为24帧。

     

    调试过程中出现的问题:

    1.当前不会命中断点 还没有为该文档加载任何符号

        这因为编译器生成的符号文件与源代码不同。将工具->选项->调试中的要求源文件与原始版本完全匹配选项取消。清除项目并重新生成再运行。

    2.读取文件失败

        由于电脑处理速度有限,加上点云数据很大,因此加载时间会很长,并不是读取有问题,耐心等待即可。

     

    程序代码:

    // RANSAC.cpp: 定义控制台应用程序的入口点。

    #include "stdafx.h"

    #include <pcl/ModelCoefficients.h>

    #include <iostream>//标准C++库中的输入输出类相关头文件。

    #include <pcl/io/pcd_io.h>

    #include <pcl/io/io.h>

    #include <pcl/io/ply_io.h>

    #include <pcl/visualization/cloud_viewer.h>

    #include <pcl/point_types.h>

    #include <pcl/filters/extract_indices.h>

    #include <pcl/filters/passthrough.h>

    #include <pcl/features/normal_3d.h>

    #include <pcl/sample_consensus/method_types.h>

    #include <pcl/sample_consensus/model_types.h>

    #include <pcl/segmentation/sac_segmentation.h>

    using namespace std;

    using namespace pcl;

    typedef pcl::PointXYZ PointT;

    void viewerOneOff(visualization::PCLVisualizer& viewer) {

           viewer.setBackgroundColor(0, 0, 0);   //设置背景颜色为黑色

    }

    int

    main(int argc, char** argv)

    {

           // All the objects needed

           pcl::PCDReader reader;                    //PCD文件读取对象

           pcl::PassThrough<PointT> pass;             //直通滤波对象

           pcl::NormalEstimation<PointT, pcl::Normal> ne;  //法线估计对象

           pcl::SACSegmentationFromNormals<PointT, pcl::Normal> seg;    //分割对象

           pcl::PCDWriter writer;            //PCD文件读取对象

           pcl::ExtractIndices<PointT> extract;      //点提取对象

           pcl::ExtractIndices<pcl::Normal> extract_normals;    ///点提取对象

           pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>());

           // Datasets

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

           pcl::PointCloud<PointT>::Ptr cloud_filtered(new pcl::PointCloud<PointT>);

           pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);

           pcl::PointCloud<PointT>::Ptr cloud_filtered2(new pcl::PointCloud<PointT>);

           pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2(new pcl::PointCloud<pcl::Normal>);

           pcl::ModelCoefficients::Ptr coefficients_plane(new pcl::ModelCoefficients), coefficients_cylinder(new pcl::ModelCoefficients);

           pcl::PointIndices::Ptr inliers_plane(new pcl::PointIndices), inliers_cylinder(new pcl::PointIndices);

           // Read in the cloud data

           reader.read<pcl::PointXYZ>("table_scene_mug_stereo_textured.pcd", *cloud);

          

           if (-1 == pcl::io::loadPCDFile<pcl::PointXYZ>("table_scene_mug_stereo_textured.pcd", *cloud))

           {

                  return -1;

           }

           visualization::CloudViewer viewer("Cloud Viewer: Scene");     //创建viewer对象

           viewer.showCloud(cloud);

           viewer.runOnVisualizationThreadOnce(viewerOneOff);

           std::cerr << "PointCloud has: " << cloud->points.size() << " data points." << std::endl;

           // 直通滤波,将Z轴不在(0,1.5)范围的点过滤掉,将剩余的点存储到cloud_filtered对象中

           pass.setInputCloud(cloud);

           pass.setFilterFieldName("z");

           pass.setFilterLimits(0, 1.5);

           pass.filter(*cloud_filtered);

           std::cerr << "PointCloud after filtering has: " << cloud_filtered->points.size() << " data points." << std::endl;

           // 过滤后的点云进行法线估计,为后续进行基于法线的分割准备数据

           ne.setSearchMethod(tree);

           ne.setInputCloud(cloud_filtered);

           ne.setKSearch(50);

           ne.compute(*cloud_normals);

           // Create the segmentation object for the planar model and set all the parameters

           seg.setOptimizeCoefficients(true);

           seg.setModelType(pcl::SACMODEL_NORMAL_PLANE);

           seg.setNormalDistanceWeight(0.1);

           seg.setMethodType(pcl::SAC_RANSAC);

           seg.setMaxIterations(100);

           seg.setDistanceThreshold(0.03);

           seg.setInputCloud(cloud_filtered);

           seg.setInputNormals(cloud_normals);

           //获取平面模型的系数和处在平面的内点

           seg.segment(*inliers_plane, *coefficients_plane);

           std::cerr << "Plane coefficients: " << *coefficients_plane << std::endl;

           // 从点云中抽取分割的处在平面上的点集

           extract.setInputCloud(cloud_filtered);

           extract.setIndices(inliers_plane);

           extract.setNegative(false);

           // 存储分割得到的平面上的点到点云文件

           pcl::PointCloud<PointT>::Ptr cloud_plane(new pcl::PointCloud<PointT>());

           extract.filter(*cloud_plane);

           std::cerr << "PointCloud representing the planar component: " << cloud_plane->points.size() << " data points." << std::endl;

           writer.write("table_scene_mug_stereo_textured_plane.pcd", *cloud_plane, false);

           

           if (-1 == pcl::io::loadPCDFile<pcl::PointXYZ>("table_scene_mug_stereo_textured_plane.pcd", *cloud_plane))

           {

                  return -1;

           }

           visualization::CloudViewer viewer_plane("Cloud Viewer:Plane");     //创建viewer对象

           viewer_plane.showCloud(cloud_plane);

           viewer_plane.runOnVisualizationThreadOnce(viewerOneOff);

           // Remove the planar inliers, extract the rest

           extract.setNegative(true);

           extract.filter(*cloud_filtered2);

           extract_normals.setNegative(true);

           extract_normals.setInputCloud(cloud_normals);

           extract_normals.setIndices(inliers_plane);

           extract_normals.filter(*cloud_normals2);

           // Create the segmentation object for cylinder segmentation and set all the parameters

           seg.setOptimizeCoefficients(true);   //设置对估计模型优化

           seg.setModelType(pcl::SACMODEL_CYLINDER);  //设置分割模型为圆柱形

           seg.setMethodType(pcl::SAC_RANSAC);       //参数估计方法

           seg.setNormalDistanceWeight(0.1);       //设置表面法线权重系数

           seg.setMaxIterations(10000);              //设置迭代的最大次数10000

           seg.setDistanceThreshold(0.05);         //设置内点到模型的距离允许最大值

           seg.setRadiusLimits(0, 0.1);             //设置估计出的圆柱模型的半径的范围

           seg.setInputCloud(cloud_filtered2);

           seg.setInputNormals(cloud_normals2);

           // Obtain the cylinder inliers and coefficients

           seg.segment(*inliers_cylinder, *coefficients_cylinder);

           std::cerr << "Cylinder coefficients: " << *coefficients_cylinder << std::endl;

           // Write the cylinder inliers to disk

           extract.setInputCloud(cloud_filtered2);

           extract.setIndices(inliers_cylinder);

           extract.setNegative(false);

           pcl::PointCloud<PointT>::Ptr cloud_cylinder(new pcl::PointCloud<PointT>());

           extract.filter(*cloud_cylinder);

           if (cloud_cylinder->points.empty())

                  std::cerr << "Can't find the cylindrical component." << std::endl;

           else

           {

                  std::cerr << "PointCloud representing the cylindrical component: " << cloud_cylinder->points.size() << " data points." << std::endl;

                  writer.write("table_scene_mug_stereo_textured_cylinder.pcd", *cloud_cylinder, false);

           }

           if (-1 == pcl::io::loadPCDFile<pcl::PointXYZ>("table_scene_mug_stereo_textured_cylinder.pcd", *cloud_cylinder))

           {

                  return -1;

           }

           visualization::CloudViewer viewer_cylinder("Cloud Viewer:Cylinder");     //创建viewer对象

           viewer_cylinder.showCloud(cloud_cylinder);

           viewer_cylinder.runOnVisualizationThreadOnce(viewerOneOff);

           

           system("pause");

           return (0);

    }

     

     

     

     

    运行结果:

    数据输出:

    点云窗口——处理前场景:

    点云窗口——分割的平面:

    点云窗口——分割的圆柱体:

    展开全文
  • 同轴喷射器的工作原理是具有同心圆柱体,液体(在这种情况下是铅)穿过中心圆柱体,高速气体(在这种情况下是空气)流过环形空间。 当高速气体接触低速液体时,剪切应力和亥姆霍兹不稳定性导致液体雾化。 可以在图 1...
  • 针对圆柱体任意两个横截面间的相对转动动力学方程,运用解耦方法获得方程的解析解,由于方程的特殊性,利用变量代换求得两次积分解。从而得到圆柱体相对转动动力学方程的积分形式表达式。根据工程应用,给出了冲击...
  • 本文将要介绍如何使用代码绘制一个圆柱体,通过绘制圆柱体可以更好的掌握法线,UV,TriangleFan,TriangleStrip等相关知识。在绘制之前,先进行一些准备工作。 GLGeometry 为了更方便的进行顶点数据的管理,我创建了...
  • 利用边界元方法对不同间距的五圆柱体绕流问题进行研究———即边界元方法在水利方面的应用,得到了不同间距的五圆柱体绕流的速度场、内点的压力场、边界的压力分布以及各圆柱体所受到的黏性摩擦阻力。为了提高计算的...
  • 本题要求自定义函数求圆和圆柱体的表面积。 自定义两个area函数,一个形参的实现求圆的面积,两个形参的实现求圆柱体的表面积。PI是全局符号常量。 函数接口定义: double area(double r); //圆的面积 double...
  • 使用matplotlib在一个3D坐标轴下绘制任意位置、任意姿态的圆柱体
  • 在本文中,研究了无限均匀且各向同性的弹性介质中扁平压缩脉冲与层状圆柱体相互作用的情况。 通过积分傅立叶变换的方法解决了该问题。 通过Romberg方法计算出数值的逆变换。 随着烘烤时间和动量的减少,精度不低于2...
  • 1525:Cylinder(圆柱体)TimeLimit:1SecMemoryLimit:128MBSubmit:14Solved:4Description使用铰剪和一张纸,根据下面的步骤,可以剪出两个面来构成一个圆柱体:1平行于最短边把纸剪成两个长方形;2在第一长方形上,剪一个...
  • 圆柱体运动简化为质量-弹簧-阻尼系统,将Newmark-β方法代码写入用户自定义函数(UDF)求解运动方程,柱体与流体间的非线性耦合作用通过动网格技术实现。详细分析了涡激力系数、柱体位移特征值和尾流涡结构随频率比的...
  • 为增大调谐液体阻尼器( TLD)中液体的晃动质量,以获得更优的动力特性,首次提出内置横向圆柱体TLD( TLD embedded a transverse cylinder,简称TLDETC)的概念。结合流体力学原理以及能量方法推导了TLDETC的晃动质量、晃...
  • 7-1 计算圆柱体的体积 (15分)

    千次阅读 2020-11-06 23:35:36
    7-1 计算圆柱体的体积 (15分) 水水水 输入圆柱的高和半径,求圆柱体积,volume=π×r​2×h 。要求定义和调用函数cylinder (r, h )计算圆柱体的体积。 输入格式: 输入在一行中给出2个实数,分别为半径r和高h。 输出...
  • 用实验方法研究了悬臂圆柱体在轴向流作用下的屈曲问题。对实验管道在几种不同的平均流速下做了多次重复实验,获得了第一振型屈曲参数相关实验数据。实验结果表明:当平均流速达到一定值时,悬臂圆柱体会发生第一阶屈曲;...
  • 本文详细介绍了MATLAB中的RANSAC圆柱体拟合方法与实现
  • 写在前面: 本人南京邮电大学计算机...前两个参数是半径,这个可以自己定,第三个是圆柱体高度,自然就是两点间距离呗,有了这几个参数,圆柱体也就确定下来了。 接下来,就要确定圆柱体的位置。 Three.js中的几何体都
  • 提取点云中的树干,路灯等圆柱体

    千次阅读 2017-11-27 11:12:51
    先将点云投影到二维网格上,每个网格存有该网格对应的所有点的信息,选取密度大于阈值的网格,取其及其邻域内所有点,用pcl中RANSAC算法拟合圆柱体,提取出内点并输出。 代码如下: #include #include #include ...
  • 判断两个圆柱体是否相交

    千次阅读 2015-08-30 20:36:55
    解法问题中的圆柱假设有中轴线,lil_i, 用固定点 Xi=(ai,bi,ci)TX_i=(a_i,b_i,c_i)^T 和方向 Wi=(wi1,wi2,wi3)TW_i=(w_1^i,w_2^i,w_3^i)^T 表达。投影矩阵 TiT_i 和 P∗P^*的求法都参考 这里的理论准备。
  • 利用JAVA中关于继承的相关知识求得圆柱体体积并输出 Write a program: 1)Define a Circle class and a Cylinder class, which is derived from the Circle and is the main class. 2)Circle class has one field: ...
  • 圆柱体 圆柱体咋一看有点费劲,我们不妨拆解来看。一个圆柱体可以分为两个圆形底面和一个弧面的侧面。在前面我们已经画过圆形了,我们这里就考虑弧面去如何实现就行了。类比圆形的实现原理,我们也可以把侧面圆筒...
  • // 存储分割得到的平面上的点到点云文件 pcl :: PointCloud < PointT > :: Ptr cloud_plane ( new pcl :: PointCloud < PointT > ( ) ) ; extract . filter ( * cloud_plane ) ; std :: cerr "Point...
  • 废话就不多说了,开始。。。 http://acmore.net/problem.php?id=1525 1525:Cylinder(圆柱体) TimeLimit:1SecMemoryLimit:128MB Submit:14Solved:4 Submit Status WebBoard Descrip...
  • PCL学习:点云分割-圆柱体模型分割

    千次阅读 2019-07-08 14:28:13
    PointT, PointNT >是利用采样一致性方法进行点云分割的类,与其父类 SACSegmentation 不同之处在于其在算法实现时采用了法线信息,即该类在进行运算输出之前需要设定法线信息 ,其继承关系如图所示...
  • 之后,可以按需直接给定装饰的高度,而不用考虑如何配合ECharts预置的计算方法来保证效果了。 当然,在实际使用时,柱状图往往是由多组series组成的。下例展示了如何对这种情况进行计算。同时,为了保有ECharts柱状...
  • (计算圓柱体的体积)编写程序,读人圆柱体的半径和高,并使用下列公式计算圆柱的体积 面积 =半径 x 半径 x p 体积 = 面积 X 高 import java.util.Scanner; class Vol{ //计算圆柱体的体积 public static void main...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,613
精华内容 2,645
关键字:

得到圆柱体的方法