精华内容
下载资源
问答
  • 边界提取采用PCL库里边的方法,基于法线估计来实现的边界检测与提取: 首先从原始点云上计算出法线,再由法线结合数据估计出边界。(这样解释还是特别抽像吧) ------------法线求解:(平面的法线是垂直于它的...

    该边界提取采用PCL库里边的方法,基于法线估计来实现的边界检测与提取:

    首先从原始点云上计算出法线,再由法线结合数据估计出边界。(这样解释还是特别抽像吧)

    ------------法线求解:(平面的法线是垂直于它的单位向量。在点云的表面的法线被定义为垂直于与点云表面相切的平面的向量。法线提供了关于曲面的曲率信息)

    对点云数据集的每个点的法线估计,可以看作是对表面法线的近似推断。(因此该表面的判断就是你寻找的周围几个点或者半径内几个点组成的平面,就是下述代码中reforn这个参数,该参数的设置一般设置为分辨率的10倍时,效果较好,主要是对于法线估计。邻域半径选择太小了,噪声较大,估计的法线就容易出错,而搜索邻域半径设置的太大估计速度就比较慢。)

    ----------求解原理

    确定表面一点法线的问题近似于估计表面的一个相切面法线的问题,因此转换过来以后就变成一个最小二乘法平面拟合估计问题。

    平面方程用法线式表示为:\cos\alpha \cdot x+\cos\beta \cdot y+\cos\gamma \cdot z+p=0

    \cos\alpha ,\cos\beta ,\cos\gamma为平面上点(x,y,z)处法向量的方向余弦,|p|为原点到平面的距离。

    ax+by+cz=d(d\geqslant 0),\qquad a^{2}+b^{2}+c^{2}=1     (此处a,b,c能够构成该平面的一个法向量n,后边的约束条件三方和为1只是控制了法向量大小,并没有改变方向,是为了下边利用点到平面的距离公式时,控制分母为1简化计算)

    a,b,c,d求平面方程即转化为求四个参数。

    将上式整理为:                    Ax=\lambda x    (由该式子联系求特征值特征向量可以想到,\lambda为特征值,x(a,b,c)^{T}\lambda对应的特征向量)

    即转化到了求解矩阵A的特征值与特征向量的问题,矩阵A即为n个点的协方差矩阵。(a,b,c)^{T}即为该矩阵的一个特征向量。

    //PCL中的NormalEstimation
    #include <pcl/point_types.h>
    #include <pcl/features/normal_3d.h>
    
    {
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    
      ... read, pass in or create a point cloud ...
    
      // Create the normal estimation class, and pass the input dataset to it
      pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
      ne.setInputCloud (cloud);
    
      // Create an empty kdtree representation, and pass it to the normal estimation object.
      // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
      pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
      ne.setSearchMethod (tree);
    
      // Output datasets
      pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);
    
      // Use all neighbors in a sphere of radius 3cm
      ne.setRadiusSearch (0.03);
    
      // Compute the features
      ne.compute (*cloud_normals);
    
      // cloud_normals->points.size () should have the same size as the input cloud->points.size ()*
    }

    OpenMP加速法线估计
    PCL提供了表面法线估计的加速实现,基于OpenMP使用多核/多线程来加速计算。 该类的名称是pcl :: NormalEstimationOMP,其API与单线程pcl :: NormalEstimation 100%兼容。 在具有8个内核的系统上,一般计算时间可以加快6-8倍。

    include <pcl/point_types.h>
    #include <pcl/features/normal_3d_omp.h>
    
    {
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    
      ... read, pass in or create a point cloud ...
    
      // Create the normal estimation class, and pass the input dataset to it
      pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
      ne.setNumberOfThreads(12);  // 手动设置线程数,否则提示错误
      ne.setInputCloud (cloud);
    
      // Create an empty kdtree representation, and pass it to the normal estimation object.
      // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
      pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
      ne.setSearchMethod (tree);
    
      // Output datasets
      pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);
    
      // Use all neighbors in a sphere of radius 3cm
      ne.setRadiusSearch (0.03);
    
      // Compute the features
      ne.compute (*cloud_normals);
    
      // cloud_normals->points.size () should have the same size as the input cloud->points.size ()*
    }
    

    上述完整的介绍了法线的估计过程,自认为只要有稍微的高数基础应该都能看懂的哈哈

    下边接着开始,怎么根据求的法线来找边界呢???

    基于法线完成的边界估计主要是利用各个法线方向之间的夹角来做的判断(所以有个设置角度的阈值参数)。(此处还是没有太明白怎么根据法线夹角确定哪些点是边界点,如有特别明白的可以下边评论留言。)

    对于边界的估计就是这个函数boundEst.setRadiusSearch(re),参数re也设置为分辨率(此处的分辨率指的是点云的密度)的10倍,太小则内部的很多点就都当成边界点了。最后一个参数是边界判断时的角度阈值,默认值为PI/2,此处设置为PI/4,用户也可以根据需要进行更改。

    #include <iostream>
    #include <pcl/console/parse.h>
    #include <pcl/filters/extract_indices.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <boost/thread/thread.hpp>
    #include <pcl/features/boundary.h>
    #include <math.h>
    #include <boost/make_shared.hpp>
    #include <pcl/point_cloud.h>
    #include <pcl/visualization/cloud_viewer.h>
    #include <pcl/visualization/range_image_visualizer.h>
    #include <pcl/features/normal_3d.h>
    #include <pcl/filters/covariance_sampling.h>
    #include <pcl/filters/normal_space.h>
    #include <pcl/kdtree/kdtree_flann.h>
    #include <pcl/io/ply_io.h>
    #include <pcl/filters/statistical_outlier_removal.h>
    int estimateBorders(pcl::PointCloud<pcl::PointXYZI>::Ptr &cloud, float re, float reforn)
    {
    	pcl::PointCloud<pcl::Boundary> boundaries; //保存边界估计结果
    	pcl::BoundaryEstimation<pcl::PointXYZI, pcl::Normal, pcl::Boundary> boundEst; //定义一个进行边界特征估计的对象
    	pcl::NormalEstimation<pcl::PointXYZI, pcl::Normal> normEst; //定义一个法线估计的对象
    	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); //保存法线估计的结果
    	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_boundary(new pcl::PointCloud<pcl::PointXYZI>);
    	normEst.setInputCloud(pcl::PointCloud<pcl::PointXYZI>::Ptr(cloud));
    	normEst.setRadiusSearch(reforn); //设置法线估计的半径//normEst.setKSearch(10);//表示计算点云法向量时,搜索的点云个数
    	normEst.compute(*normals); //将法线估计结果保存至normals
        //输出法线的个数
        std:cout << "reforn: " << reforn << std::endl;
        std::cerr << "normals: " << normals->size() << std::endl;
    
    	boundEst.setInputCloud(cloud); //设置输入的点云
    	boundEst.setInputNormals(normals); //设置边界估计的法线,因为边界估计依赖于法线
    	boundEst.setRadiusSearch(re); //设置边界估计所需要的半径,//这里的Threadshold为一个浮点值,可取点云模型密度的10倍
    	boundEst.setAngleThreshold(M_PI / 4); //边界估计时的角度阈值M_PI / 4  并计算k邻域点的法线夹角,若大于阈值则为边界特征点
    	boundEst.setSearchMethod(pcl::search::KdTree<pcl::PointXYZI>::Ptr(new pcl::search::KdTree<pcl::PointXYZI>)); //设置搜索方式KdTree
    	boundEst.compute(boundaries); //将边界估计结果保存在boundaries
    
    	std::cerr << "AngleThreshold: " << M_PI / 4 << std::endl;
    	//输出边界点的个数
    	std::cerr << "boundaries: " << boundaries.points.size() << std::endl;
    	//存储估计为边界的点云数据,将边界结果保存为pcl::PointXYZ类型
    	for (int i = 0; i < cloud->points.size(); i++)
    	{
    		if (boundaries[i].boundary_point > 0)
    		{
    			cloud_boundary->push_back(cloud->points[i]);
    		}
    		
    	}
    	pcl::PCDWriter writer;
    	std::stringstream ss;
    	ss << "boundary" << ".pcd";
    	writer.write<pcl::PointXYZI>(ss.str(), *cloud_boundary, false);
    	//可视化显示原始点云与边界提取结果
    	boost::shared_ptr<pcl::visualization::PCLVisualizer> MView(new pcl::visualization::PCLVisualizer("边界提取"));
    
    	int v1(0);
    	MView->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
    	MView->setBackgroundColor(0.3, 0.3, 0.3, v1);
    	MView->addText("Raw point clouds", 10, 10, "v1_text", v1);
    	int v2(0);
    	MView->createViewPort(0.5, 0.0, 1, 1.0, v2);
    	MView->setBackgroundColor(0.5, 0.5, 0.5, v2);
    	MView->addText("Boudary point clouds", 80, 80, "v2_text", v2);
    	MView->addPointCloud<pcl::PointXYZI>(cloud, "sample cloud", v1);
    	MView->addPointCloud<pcl::PointXYZI>(cloud_boundary, "cloud_boundary", v2);
    	MView->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "sample cloud", v1);
    	MView->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "cloud_boundary", v2);
    	MView->addCoordinateSystem(1.0);
    	MView->initCameraParameters();
    	MView->spin();
    	return 0;
    }
    int
    main(int argc, char** argv)
    {
    	srand(time(NULL));
    	float re, reforn;
    	re = std::atof(argv[2]);
    	reforn = std::atof(argv[3]);
    	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_src(new pcl::PointCloud<pcl::PointXYZI>);
    	pcl::io::loadPCDFile(argv[1], *cloud_src);
    	 //创建滤波器对象
    	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZI>);
    	pcl::StatisticalOutlierRemoval<pcl::PointXYZI> sor;
    	sor.setInputCloud(cloud_src);
    	sor.setMeanK(100);//寻找每个点的50个最近邻点
    	sor.setStddevMulThresh(3.0);//一个点的最近邻距离超过全局平均距离的一个标准差以上,就会舍弃
    	sor.filter(*cloud_filtered);
    	std::cout << "cloud_src: " << cloud_src->points.size() << std::endl;
    	std::cout << "cloud_filtered: " << cloud_filtered->points.size() << std::endl;
    	estimateBorders(cloud_src, re, reforn);
    	return 0;
    }
    
    

    右键项目->属性->在命令行输入参数:如下所示:(以上需要三个参数)

    结果如下:

                           

    s

    展开全文
  • 边界提取采用PCL库里边的方法,基于法线估计来实现的边界检测与提取: 首先从原始点云上计算出法线,再由法线结合数据估计出边界。(这样解释还是特别抽像吧) ------------法线求解:(平面的法线是垂直于它的...
    展开全文
  • 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点,可快速准确提取边界点,其原理如下: ... 平面点云边界提取算法研究[D].长沙理工大学,2017. ...

    由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点,可快速准确提取边界点,其原理如下:

    如下图所示,对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动。若滚动圆半径a足够小时,则点云中每一点均为边界点;若适当增大到一定程度,其只在边界点上进行滚动,其滚动的轨迹为点云边界。

    效果图如下:

          

    参考文献:

    [1]平面点云边界提取算法研究[D].长沙理工大学,2017.

    展开全文
  • 直线提取边界追踪

    2020-01-07 16:01:58
    一般物体平面图像的轮廓可近似为直线及弧线的组合,对物体轮廓的检测与识别可以转化为对这些基元的检测与提取。另外,在运动图像分析和估计领域也可以采用直线对应法实现刚体旋转量和位移量的测量,所以直线检测对...


    图像的基本特征之一是直线。一般物体平面图像的轮廓可近似为直线及弧线的组合,对物体轮廓的检测与识别可以转化为对这些基元的检测与提取。另外,在运动图像分析和估计领域也可以采用直线对应法实现刚体旋转量和位移量的测量,所以直线检测对图像算法的研究具有重要意义。
    边缘是一个局部的概念,一个区域的边界是一个整体的概念,边界追踪是一种串行的图像分割技术。图像由于噪声以及光照不均匀等原因,边缘点可能是不连续的,边界追踪可以将其变为有意义的信息。下面分别介绍直线的提取与边界追踪。

    1.用霍夫变换提取直线

    Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。它通过将原图像上的点映射到用于累加的参数空间,实现对已知解析式曲线的识别。由于利用了图像的全局特性,所以受噪声和边界间断的影响较小,鲁棒性能好。Hough变换常用来对图像中的直线进行识别。
    图像上任意直线区域都可以一一对应参数空间中的点,而图像上的任意像素都同时存在于很多直线区域之上。将图像上的直线区域想象为容器,把特定像素想象成放在容器中的棋子,只不过在这里,每个棋子都可以同时存在于多个容器中。那么Hough变换可以理解为依次检查图像上的每个棋子(特定像素),对于每个棋子,找到所有包含它的容器(平面上的直线区域),并为每个容器的计数器加1,这样就可以统计出每个容器(平面上的直线区域)所包含的棋子(特定像素数量)。当图像上某个直线区域包含的特定像素足够多时,就可以认为这个直线区域表示的直线存在。
    在MATLAB中,通过Hough变换在图像中检测直线需要以下3个步骤。
    (1)利用hough()函数执行霍夫变换,得到霍夫矩阵;
    (2)利用houghpeaks()函数在霍夫矩阵中寻找峰值点;
    (3)利用houghlines()函数在前两步结果的基础上得到原二值图像中的直线信息。这些函数的调用方法为

    [H,theta,rho]=hough(BW,param1,vall,param2,val2)
    

    其中,BW是边缘检测后的图像;param1、val1及param2、val2为可选参数;H是变换得到的Hough矩阵;theta和rho为分别对应于Hough矩阵每一列和每一行的θ和ρ值组成的向量。

    peaks=houghpeaks(H,numpeaks,param1,val1,param2,val2)
    

    其中,H是由hough()函数得到的Hough矩阵;numpeaks是要寻找的峰值数目,默认为1;peaks是一个Q×2的矩阵,每行的两个元素分别为某一峰值点在Hough矩阵中的行、列索引,Q为找到的峰值点的数目。

    lines=houghlines(BW,theta,rho,peaks,param1,val1,param2,val2)
    

    其中,BW是边缘检测后的图像;theta和rho是Hough矩阵每一列和每一行的θ和ρ值组成的向量,由hough函数返回;peaks是一个包含峰值点信息的Q×2的矩阵,由houghpeaks函数返回;lines是一个结构体数组,数组长度是找到的直线条数。
    对图像进行Hough变换提取直线

    **clear all
    close all
    RGB=imread('peppers.png');
    I=rgb2gray(RGB);
    BW=edge(I,'Canny');
    [H,T,R]=hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);%计算霍夫变换
    subplot(121)
    imshow(RGB)
    title('原始图像')
    subplot(122)
    imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,...
        'InitialMagnification','fit');
    title('Hough变换')
    xlabel('\theta轴'),ylabel('\rho轴');
    axis on
    axis normal
    hold on
    colormap(hot)
    

    在这里插入图片描述
    将一幅图像进行Hough变换,标出峰值位置

    clear all
    close all
    I=imread('eight.tif');
    subplot(121)
    imshow(I)
    title('原始图像')
    BW=edge(imrotate(I,50,'crop'),'prewitt');
    [H,T,R]=hough(BW);
    P=houghpeaks(H,2);
    subplot(122)
    imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');%显示Hough变换
    title('Hough变换')
    xlabel('\theta轴'),ylabel('\rho轴')
    axis on,axis normal
    hold on
    plot(T(P(:,2)),R(P(:,1)),'s','color','white');%标记颜色为白色
    

    在这里插入图片描述
    对图像进行Hough变换,并标出最长的线段

    clear all
    close all
    I=imread('blobs.png');
    subplot(131)
    imshow(I)
    title('原始图像')
    rotI=imrotate(I,45,'crop');
    BW=edge(rotI,'sobel');
    [H,T,R]=hough(BW);
    subplot(132)
    imshow(H,[],'XData',T,'YData',R,...
        'InitialMagnification','fit')
    title('Hough变换')
    xlabel('\theta轴'),ylabel('\rho轴')
    axis on,axis normal
    hold on
    P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%寻找极值点
    x=T(P(:,2));
    y=R(P(:,1));
    plot(x,y,'s','color','white');
    lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);%找出对应的直线边缘
    subplot(133)
    imshow(rotI)
    title('检测线段')
    hold on
    max_len=0;
    for k=1:length(lines)
        xy=[lines(k).point1;lines(k).point2];
        plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
        %标记直线边缘对应的起点
        plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','blue')
        plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red')
        len=norm(lines(k).point1-lines(k).point2);%计算直线边缘长度
        if(len>max_len)
            max_len=len;
            xy_long=xy;
        end
    end
    plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','b')
    

    在这里插入图片描述

    2.边界跟踪

    边界追踪是指从图像的一个边缘点出发,然后根据某种判别准则搜索下一个边缘点以此跟踪目标边界。边界跟踪的算法步骤如下:
    (1)确定边界的起始搜索点,起始点的选择很关键,对某些图像,选择不同的起始点会导致不同的结果
    (2)确定合适边界判别准则和搜索准则,判别准则用于判断一个点是不是边界点,搜索准则用于指导如何搜索下一个边缘点;
    (3)确定搜索终止的条件
    在MATLAB中,bwtraceboundary函数采用基于曲线跟踪的策略,给定搜索起始点和搜索方向及其返回该起始点的一条边界;bwboundaries函数用于获取二值图像中对象的轮廓。这两种函数的用法如下所示:

    B=bwtraceboundary(BW,P,fstep)
    B=bwtraceboundary(BW,P,fstep,conn)
    B=bwtraceboundary(...,N,dir)
    

    其中,非零像素表示对象,零像素构成背景;bwtraceboundary返回值为B,一个Q×2的矩阵,Q是区域边界像素的数量;B保存有边界像素的行、列坐标;参数P是一个指定行、列坐标的二元矢量,表示对象边界上开始跟踪的那个点;fstep表示初始查找方向,用于寻找对象中与P相连的下一个像素,fstep是寻找下一个相连像素点的初始方向;dir是寻找边界的方向,即顺时针还是逆时针。

    B=bwboundaries(BW,conn)
    

    其中,B是一个P×1数组,P为对象个数,每个对象是Q×2的矩阵,对应于对象轮廓像素的坐标。
    对图像进行边界跟踪提取。

    clear all
    close all
    RGB=imread('saturn.png');
    figure
    subplot(131)
    imshow(RGB)
    title('原始图像')
    I=rgb2gray(RGB);
    threshold=graythresh(I);
    BW=im2bw(I,threshold);
    subplot(132)
    imshow(BW)
    title('二值图像')
    dim=size(BW);
    col=round(dim(2)/2)-90;%计算起始点的列坐标
    row=find(BW(:,col),1);%计算起始点行坐标
    connectivity=8;
    num_points=180;
    contour=bwtraceboundary(BW,[row col],'N',connectivity,num_points);%提取边界
    subplot(133)
    imshow(RGB)
    hold on
    plot(contour(:,2),contour(:,1),'g','LineWidth',2)
    title('结果图像')
    

    在这里插入图片描述
    对图像进行边界跟踪提取

    clear all
    close all
    I=imread('blobs.png');
    figure(1)
    subplot(121)
    imshow(I)
    title('原始图像')
    B=bwboundaries(I);
    D=B{1,1};
    subplot(122)
    plot(D(:,2),D(:,1))
    set(gca,'YDir','reverse')
    title('边界标记后的图像')
    

    在这里插入图片描述
    对图像中不同的区域表示不同的颜色

    clear all
    close all
    I=imread('tape.png');
    figure(1)
    subplot(131)
    imshow(I)
    title('原始图像')
    BW=im2bw(I,graythresh(I));%生成二值图像
    subplot(132)
    imshow(BW)
    title('二值图像')
    [B,L]=bwboundaries(BW,'noholes');%提取边界,并返回边界元胞数组B和区域标志数组L
    subplot(133)
    imshow(label2rgb(L,@jet,[.5,.5,.5]))%以不同的颜色标志不同的区域
    title('彩色标机图像')
    hold on
    for k=1:length(B)
        boundary=B{k};
        plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)%在图像上叠画边界
    end
    

    在这里插入图片描述

    展开全文
  • 然而,由于噪声和提取直线算法的影响,凹凸面的关键边界直线未能提取出来,那么如何识别无法提取出的关键凹凸面边界直线,是一个有待解决的问题。提出了通过同名直线(对应直线)前方交会出空间直线、空间直线基于带...
  • 为了在具有多个特征边界的散乱点云上提取指定目标特征边界,提出了一种基于目标特征边界交互提取的算法。拾取目标特征及其周围的点云。利用[KD]树建立散乱点云的空间拓扑关系,计算出每个数据点的[k]邻域。通过数据...
  • 平面上点的二维坐标定位, 提出区域“十”字算法进行切片数据边界提取, 获取切片数据的最外层点, 将检测到的边界点存回原始三维数据源, 完成预处理过程。实验结果证明, 该算法对边界点具有较强的识别能力, 能够...
  • 其次通过随机采样一致性算法将印制电路板中面积最大的平面特征单独提取出来,使关键轮廓特征实现了在空间上的分离;再采用基于法向量夹角限制条件的欧氏聚类完成折边特征的点聚类,从而实现将折边线转化为边界线的思想;...
  • Square算法为了提取图案的边界, 首先,对给定的数字图像,即在网格平面白像素背景上的一组黑色像素,我们需要找到一个黑色边界像素,并把它作为跟踪的“开始”点。 算法将从该“开始”点出发来完成对边界的跟踪。...
  • 1 省级、地市级、区县级、乡镇街道及自定义区域范围等情况区域热力层的使用 ...1.1 区域GeoJSON边界数据提取(1)GeoJSON行政区划边界提取小工具 DataV.GeoAtlas,最低到 区县级,区域adcode可以查阅 钉...
  • 专门针对具有Robin边界条件的LM(1,2),我们精确地在任意有限大小N的带上求解模型,并使用Euler-Maclaurin公式提取有限大小的保形校正。 该解决方案的关键是通勤双行传输矩阵满足的求逆身份。 反演身份直接建立在...
  • 文章目录1、什么是角点2、如何区分角点、边界平面3、角点公式推导4、OpenCV相关函数5、角点检测程序实现最后 1、什么是角点   同角点并列的还有边界点、平面点。看下面的图可以看出来三者之间的位置关系。 从...
  • 图象的骨架提取算法

    万次阅读 热门讨论 2006-02-27 09:25:00
    把一个平面区域简化成图(graph)是一种重要的结构形状表示法。利用细化技术以得到区域的骨架是常用的方法。中轴变换(medial axis transform,MAT)是一种用来确定物体骨架的细化技术。具有边界B的区域R的MAT是如下...
  • 闭合多段线可用于二维布尔运算及提取二维质心、惯性矩和其他二维数据,或者用于进行拉伸、扫掠和旋转等三维操作,或者用于表示住宅楼层平面图形,或者用于查询其封闭区域的面积和周长等。可创建闭合多段线的工具命令...
  • 其次利用整体最小二乘和加权主元分析法对随机抽样一致算法进行改进,并基于该改进算法,确定折边两侧点云平面,利用两侧点云边界特性探测建筑物折边。通过实例分析,可以确定该算法提取速度快、冗余度少,在无效点云...
  • 曲率缩放空间(CSS)技术适用于从具有嘈杂边界的对象中提取曲率特征。 为了检测多尺度框架中的角点,Rattarangsi和Chin研究了平面曲线角的尺度空间行为。 不幸的是,他们的研究是基于一个错误的假设,即平面曲线在...
  • 目标分割是利用图像的时空先验知识对像素点进行逐点分类的一个过程,目标的固有属性体现在密度及其形状即二维平面的空间分布上。既往的阈值分割大多仅利用了目标的密度信息,而忽略了其空间分布信息。鉴于形状先验...
  • 表示一个平面区域的结构形状的一种重要方法是将它简化为图形,这种简化可以通过一种细化(也称为骨架化)算法得到该区域的骨架来实现。细化是一种形态学变形,在提取中轴线的图像处理问题中,细化起着核心作用。为了...
  • 针对两个互补的平面设备几何形状研究了螺旋流线和循环电流:要么所有边界都导电,要么所有边界都绝缘。 后一种情况是指点电流触点,通过定义所谓的回路流功能,可以将其与带有外围触点的单个​​连接霍尔板进行类似...
  • 用于实际磁场感应的典型霍尔板是带有外围触点的平面,简单连接区域。 它们的输出电压是所施加磁场的偶数和奇数函数的总和。 它们通常被称为失调电压和霍尔电压。 当代的智能霍尔传感器电路通过旋转电流霍尔探头方案...
  • 打开CATIA软件,新建零件...选择任意一个平面绘制下图所示的椭圆然后退出草图,使用填充命令填充该椭圆,隐藏该草图,结果如下图所示看到上图所示的靓色的边界了吧,这是自由边的线,显示方法如下图所示工具—选项然...
  • 在双目结构光系统下,提出一种基于二值空间的条纹边界编解码方法。...实验结果表明,该方法能完整准确地提取条纹边界线,解码正确率为100%,对平面重建的误差为0.0993 mm,对复杂场景的条纹图像具有较强的抗干扰性。
  • 利用改进的k-d(k-dimensional)树搜索k邻域, 以采样点及其k邻域为参考点集拟合微切平面并向该平面投影,在微切平面上建立局部坐标系以将三维坐标转化成二维坐标, 利用场力和判定准则识别边界特征点; 依据矢量偏转角度...
  • 基于减小训练样本数目,加快SVM 训练过程的目的,提出一种基于二分网格的边界样本提取方法.数据仿真实验表明,该方法具有边界样本提取准确,效率高,速度快,能够自适应样本分布的优点,而且不会显著降低SVM分类器的性能....
  • 图纸解释如下图所示,实际零件是不理想的,通过在实际零件表面(即基准要素)提取点,提取两个实际表面分别是基准要素A和B,然后通过基准要素分别拟合自己对应的理论几何边界,即实际表面的相切平面,两个基准要素...
  • 在分析平面曲线的几何特性的基础上,提出了一种基于曲率等不变量的平面非规则边界曲线匹配的算法,该方法通过提取平面非规则曲线的角点和匹配角点来寻找初始匹配点,同时利用对应点的曲率相等或者等价的几何特性来...
  • 我们知道人眼能够从图像看到其基本的架构,主要的平面架构也能推导出来,神经网络是模仿人的眼睛推导功能,人的主要是先进行识别图片中的对象,然后对象中的较大的边界,然后再推导出哪些面是平面。但是怎么解释到...
  • 具体的过程,是通过引入控制参数δ和η,将满足相应条件的3D散乱点划分到相应的子集合中,然后对各个散乱点子集合进行判断,提取其各个子集上的控制点,构造各个子集的控制点构成的边界。最后,对每两个相邻的边界...
  • 由三维扫描仪对文物表面进行扫描得到网格数据后,先提取出破洞的边界,利用破洞边界三角形的法矢信息将破洞边界上的点投影到一个平面上,形成一个二维多边形;然后基于该二维多边形各内角及各边长度在多边形内插入新...
  • 本文利用MATLAB对圆的边界提取,再用最小二乘法拟合椭圆曲线,并借助摄影测量基本公式建立二维模型求得靶标圆心像坐标。并对该模型作 检验,再利用针孔模型分别求得两部相机像平面对应于物平面的旋转向量 和平移向量...

空空如也

空空如也

1 2 3
收藏数 58
精华内容 23
关键字:

平面边界提取