一种网格点云快速法线估计方法

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 估计法线
int TopographyMesh::normalEstimation(
    std::vector<PointType>& in_points,
    std::vector<PCTTM_TriangleFace>& face_vect,
    std::vector<Normal>& out_normals_face,
    std::vector<Normal>& out_normals_point,
    const int& k)
{
    if (in_points.size() <= 3)
    {
        std::cout << "pointVect <= 3 ..." << std::endl;
        return -1;
    }

    if (k<3)
    {
        std::cout << "‘K‘ input must >= 3 ..." << std::endl;
        return -1;
    }
    int dataSize = in_points.size();

    std::vector<Vector3d> n_vect(face_vect.size());
    std::vector<PointType> mid_vect(face_vect.size());
    for (size_t i = 0; i < face_vect.size(); i++)
    {
        Vector3d v(
            in_points[face_vect[i].p_index_1].x - in_points[face_vect[i].p_index_0].x,
            in_points[face_vect[i].p_index_1].y - in_points[face_vect[i].p_index_0].y,
            in_points[face_vect[i].p_index_1].z - in_points[face_vect[i].p_index_0].z);
        Vector3d w(
            in_points[face_vect[i].p_index_2].x - in_points[face_vect[i].p_index_0].x,
            in_points[face_vect[i].p_index_2].y - in_points[face_vect[i].p_index_0].y,
            in_points[face_vect[i].p_index_2].z - in_points[face_vect[i].p_index_0].z);

         // Normal n(0.0, 0.0, 100.0);
         //法线方向矫正
         Eigen::Vector3d v1= v.cross(w);
         Eigen::Vector3d v2(0.0, 0.0, 100.0);
         if (atan2(v1.cross(v2).norm(), v1.transpose() * v2) > 0.5*M_PI)   //判断点的法线  与 固定法线的夹角
         {
             n_vect[i] = (-1)*v1;
         }
         else
         {
             n_vect[i] = v1;
         }

        //三角形几何中心
        mid_vect[i].x = (in_points[face_vect[i].p_index_2].x + in_points[face_vect[i].p_index_1].x + in_points[face_vect[i].p_index_0].x) / 3.0;
        mid_vect[i].y = (in_points[face_vect[i].p_index_2].y + in_points[face_vect[i].p_index_1].y + in_points[face_vect[i].p_index_0].y) / 3.0;
        mid_vect[i].z = (in_points[face_vect[i].p_index_2].z + in_points[face_vect[i].p_index_1].z + in_points[face_vect[i].p_index_0].z) / 3.0;
    }

    out_normals_face = n_vect;

    //kdtree “k临近”
    KDT::KDTree skdtree;
    skdtree.setNumOfLeafData(100);   //20-200  叶子存储数据数阈值
    skdtree.setInputPointCloud(mid_vect);
    skdtree.buildKDTree();

    out_normals_point.resize(dataSize);
    for (size_t j = 0; j < dataSize; j++)
    {
        std::vector<size_t> searchIndex(k);
        std::vector<float> searchDistance(k);
        skdtree.runKNNSearchK(in_points[j], k, &(searchIndex[0]), &(searchDistance[0]));

        Eigen::Vector3d xyz(0.0,0.0,0.0);
        for (size_t i = 0; i < k; i++)
        {
            xyz += n_vect[searchIndex[i]];
        }
        out_normals_point[j] = xyz / (1.0*k);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/lovebay/p/12370003.html

时间: 2024-11-15 09:53:52

一种网格点云快速法线估计方法的相关文章

点云特征——法向量估计

点云法向量是最基本的点云特征,在诸多点云处理算法中起着至关重要的作用.本文记录了两种常用的点云法向量估计方法,分别针对一般点云和深度图两种点云组织形式. 一般点云的法向量估计 估计一般点云法向量的思路是根据邻域内的点拟合一个平面,则平面的法线方向即为点的法向量.记点的邻域为: \[\mathcal{N}=\{\mathcal{p}_i(x_i, y_i, z_i)|i=1,2,..,n\}\] 需拟合的平面的一般形式是: \begin{align} Ax+By+Cz+D &= 0 \notag

开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm

10.4Validform对象[方法支持链式调用] 如示例 var demo=$(".formsub").Validform(),那么demo对象会有以下属性和方法可以调用: tipmsg[object] 如:demo.tipmsg.s="error! no messageinputed."; 通过该对象可以修改除 tit 以外的其他提示文字,这样可以实现同一个页面的不同表单使用不同的提示文字. 具体可修改的提示文字 $.Tipmsg={//默认提示文字; tit:

开发指南专题九:JEECG微云快速开发平台-表单校验组件ValidForm

开发指南专题九:JEECG微云快速开发平台表单校验组件ValidForm 10.表单校验组件ValidForm 10.1使用入门 1.引入css 请查看下载文件中的style.css,把里面Validform必须部分复制到你的css中(文件里这个注释 "/*==========以下部分是Validform必须的===========*/" 之后的部分是必须的).(之前发现有部分网友把整个style.css都引用在了页面里,然后发现样式冲突了) 2.引入js (jquery 1.4.2

开发指南专题二:JEECG微云快速开发平台JEECG框架初探

开发指南专题二:JEECG微云快速开发平台JEECG框架初探 2.JEECG框架初探 2.1演示系统 打开浏览器输入JEECG演示环境地址:http://demo.jeecg.org:8090/可以看到如图21所示的登录界面., 图21演示系统登录界面 点击[登陆]按钮,进入演示系统的主界面,如图22所示. 图22演示系统主界面 在JEECG演示系统中的功能模块包括系统管理.流程管理.业务申请.业务办理.常用功能演示等.其中,用户管理.流程设计器的界面截图如图23和图24所示. 图2

专题开发十三:JEECG微云快速开发平台-附录

12.1UI库常用控件参考示例 序号 控件 解决方案 参考示例 1 datagrid数据列表,字段采用数据字典显示文本 <t:dgCol title="状态" sortable="true" field="status" replace="正常_1,禁用_0,超级管理员_-1"></t:dgCol> WebRoot/webpage/system/user/userList.jsp 2 树列表展现 参考示

开发指南专题九 JEECG微云快速开发平台-表单校验组件ValidForm

开发指南专题九:JEECG微云快速开发平台表单校验组件ValidForm 10.表单校验组件ValidForm 10.1使用入门 1.引入css 请查看下载文件中的style.css,把里面Validform必须部分复制到你的css中(文件里这个注释 "/*==========以下部分是Validform必须的===========*/" 之后的部分是必须的).(之前发现有部分网友把整个style.css都引用在了页面里,然后发现样式冲突了) 2.引入js (jquery 1.4.2

企业要把网站迁入阿里云服务器怎么办?方法看这里!

企业要把网站从其它服务器迁入阿里云服务器怎么办?方法看这里! 企业网站数据迁移上阿里云有以下两种方式:1)企业可以通过阿里云提供内置工具与帮助文档自己完成IT环境迁移工作,即:自助服务:2)企业还可以通过阿里云的合作伙伴,通过合作伙伴提供技术支持,帮助企业完成IT环境迁移工作,即:合作伙伴支持.点我了解详情 下面重点来了解一下第一种方法,即自助迁移.自助迁移需求用到阿里云自研的“迁云工具”来快速方便地实现网站迁移目的.阿里云迁云工具,简称迁云工具,是一个阿里云自主研发的能将计算机磁盘中的操作系统

百度贴吧云签到助手使用方法

贴吧云签到助手地址: http://tieba.aibing.cc 百度账号绑定: 注册个账号.进入签到助手/百度账号管理/自动绑定 贴吧云签到助手使用方法 输入百度账号绑定邮箱.密码即可绑定: 由于百度强制开启了异地登陆验证,很可能导致自动绑定失败.如果你确定输入无误但却提示账号密码错误,我们就只能使用 签到助手中的"手动签到".通过输入BDUSS来绑定: 1.点此登录需要绑定的百度账号2.点击此处获取BDUSS3.复制你看到的那一大串英文和数字(不包括双引号),粘贴到签到助手的输入

Colours–颜色库,包含100种预定义的颜色和方法

简介 Colours–颜色库,包含各种100种预定义的颜色和方法,可以简化颜色相关的开发工作. 项目主页: Colours 最新示例: 点击下载 快速入门 安装 通过Cocoapods安装 pod 'Colours' 手动安装 把 Colours.h 和 Colours.m拖进你的工程里,在需要的地方引入头文件即可: #import "Colours.h" 使用 调色板,一组预定义的颜色 具体可点击这里查看: 100个预定义的颜色 使用预定义的颜色 Colours 预定义了100 多种