【C++】相机标定源码笔记-通用工具函数类

提供了一系列工具函数及处理方法,主要用于图像处理、点云处理和文件操作等领域。以下是对关键函数的简要解析:

点云处理与平面拟合

  • 包含两个重载函数,一个接受Eigen矩阵类型的点集,另一个接受pcl::PointCloud<pcl::PointXYZ>类型的点云,用于拟合平面并返回平面的中心点和法向量。

文件操作

  • 文件和文件夹操作:用于创建文件夹;用于获取指定路径下的文件列表;用于将数据保存到文件中。

  • 文件筛选:用于根据文件名的后缀或前缀筛选文件;用于从文件路径中提取文件名(不包含后缀)。

图像处理

  • 角点处理:用于重新排列棋盘格角点的顺序;用于计算角点构成的棋盘格角度。

  • 世界坐标系点的生成:用于生成棋盘格上每个角点在世界坐标系中的位置。

文本和点云数据读取

  • 分别用于从TXT文件和PCD文件中读取点云数据。

激光线中心点提取

  • 通过阈值提取法提取激光线中心点。

  • 通过Steger直线检测算法提取激光线中心点。

  • 通过灰度质心法提取激光线中心点。

曲线拟合

  • 对给定的点集进行抛物线拟合,返回拟合的抛物线参数。

这段代码涵盖了计算机视觉和机器视觉中常用的一些基础功能,包括点云处理、图像处理、文件操作等,可用于各种视觉测量、表面检测和三维重建等应用场景。

--------------函数----------------

获取当前日期和时间的字符串表示:定义原始时间,定义时间信息,定义字符数组存储时间信息,获取当前的原始时间,对原始时间进行本地化处理,返回一个tm结构体指针(时间信息),将时间格式化为 "%Y_%m%d_%H%M_%S"格式,并存入字符数组前80个元素中。利用字符数组初始化并返回一个string类型变量。

使用SVD拟合平面,适用于Eigen Matrix输入:获取点的数量(矩阵行数),如果点数为0直接返回,通过求均值来找到平面中心,计算点与中心的偏差矩阵,用于SVD处理,对偏差矩阵进行SVD处理,获取法向量。

a03592fa43adc0b0aa2662a2d8e4ec6e.png

e6756c8691f855f821e04442c9c6c045.png

在点云数据中拟合一个平面,并获取该平面的中心点与法向量:获取点的数量,声明存储点的稠密矩阵,深度复制点云数据到Eigen::Matrix稠密矩阵,调用之前定义的函数,进行平面拟合操作。

对输入的字符串按指定的字符进行分割,存入一个字符串数组中并返回:创建一个字符串流,字符串temp,创建一个字符串数组用于存放分割后的字符串,使用getline函数按照指定字符分割字符串流,并将分割后的字符串存入到字符串数组中。最后返回分割后的字符串数组。

9cd8bc9ee20cf151ad79ed23082b5ecd.png

读取TXT文件并存入到点云数据中:

打开输入的txt文件,如果文件不存在则直接返回false,清空点云数据并预留大量的空间供读取,读取文件直到结束{ 创建一个浮点数组用于临时存储,从文件中读取数据并存入到浮点数组中,将浮点数组中的数据转换成点云格式存入到点云数据中} 。  重新调整点云数据的大小。关闭文件,返回true读取成功。

1db7e7410f1e1338e487167a72585cab.png

读取PCD文件并将读取到的数据存入到点云数据中:打开文件,如果文件不存在则输出错误信息并返回。定义字符缓存,跳过前9行的头部信息,第10行用空格分隔存储到字符串向量中,读取第11行,清空点云数据并预留足够空间供数据读取,初始化点云计数i=0,循环读取12行开始,用空格分隔字符串存入字符串数组,将读取的浮点数组元素转换为点云格式atof存入点云数据中。增加点云计数。 最后关闭文件返回空。

将一组三维点数据保存到指定的.txt文件: 打开要写入的文件,如果无法打开则返回。获取点数,逐个读取点并fprintf 写入文件。最后关闭文件。

根据输入的路径创建一个文件夹: 判断文件夹是否存在,若不存在则_mkdir创建文件夹.

根据输入的路径获取并返回该路径下的所有文件名: 清空文件向量,初始化文件句柄为0,定义文件信息,查找当前文件的第一个子目录获得句柄,进入do while循环(查找到下一个匹配文件){如果还有子目录,则什么都不做,如果没有子目录,则添加到文件向量。} 关闭所有关联的资源并释放存储。

根据输入的路径获取并返回该路径下的所有文件名,包括子目录下的文件:清空文件向量,初始化文件句柄为0,定义文件信息,查找当前文件的第一个子目录获得句柄,进入do while循环(查找到下一个匹配文件){如果还有子目录,则递归调用自身,如果没有子目录,则添加到文件向量。} 关闭所有关联的资源并释放存储。

过滤出以特定字符串结尾的文件名: 清空输出文件列表,获取输入文件列表的大小,获取目标子字符串的大小(后缀长度),遍历输入文件列表{获取当前文件名,提取文件名的后缀,如果后缀不匹配目标子字符串则跳过当前循环,如果后缀匹配则将文件名添加到输出文件列表中}

过滤出以特定字符串开头的文件名: 清空输出文件列表,获取输入文件列表的大小,遍历输入文件列表{ 获取当前文件名,定义用于存储文件路径分隔结果的变量(驱动器,目录,文件名,扩展),分隔文件路径,获取文件名(不包括扩展名),获取目标子字符串的大小(前缀长度),提取文件名前缀,如果前缀不匹配目标子字符串,则跳过当前循环,如果前缀匹配,则将文件名添加到输出文件列表中。}

提取文件的路径和名称: 以上函数部分。

重置棋盘格角点的顺序,确保角点从上往下,从左往右排列: 如果首角点的坐标大于尾角点坐标X\Y,则执行交换列\交换行操作。确保角点从上到下,从左到右排列。

计算多幅图像中棋盘格的角度: 清空角度列表,设置角度列表的大小,遍历所有图像棋盘点列表{获取当前起盘点列表,获取第一个点,获取最右边点,计算x方向的差值,计算y方向的差值,计算角度,保存角度}

生成单张标定棋盘格上的世界坐标点:清空标定板点列表,遍历标定板的行{遍历标定板的列{创建一个点并设置其坐标,将点添加到标定板点列表中}}。

生成多个标定图像对应的棋盘格的世界坐标点: 清空标定板点列表,遍历图像数量{创建一个临时点列表,遍历标定板的行{遍历标定板的列{ 创建一个点并设置其坐标,将点添加到临时点列表中  }} 将临时点列表添加到标定板点列表中,清空临时点列表}

提取图像中光条的函数,通过阈值方法: 定义四个边界(整型,0),清空光线图像点列表和亚像素图像点列表,创建一个输出图像,对输入图像进行阈值处理得到输出图像,遍历输出图像的行{遍历输出图像的列{ 定义浮点数累加和,定义点数(如果当前像素值为255,将当前点添加到光线图像点列表中,累加列坐标,点数计数加一) } 如果计数为0,则跳过当前循环 将平均列坐标和当前行坐标作为点添加到亚像素图像点列表中}

提取图像中光条的函数,通过Steger线检测算法(输入图像,光斑图像,图案尺寸,目标点集,输出的光条点,输出的亚像素点):清空光线图像点列表和子像素图像点列表, 创建一个输出图像,计算输入图像和光线图像的差异,并保存差异图像,对差异图像进行形态学开运算,对差异图像进行阈值处理,机型腐蚀操作,创建一个包含所有掩码点的向量(掩码点集向量),创建一个全黑的掩码图像,定义临时点变量,掩码点,复制目标点集到临时点集,定义掩码点集,添加四个角点到掩码点列表(构建掩模),绘制掩码轮廓,使用掩码复制差异图像到输出图像,保存掩码和ROI图像,计算一阶偏导数,计算二阶偏导数,遍历输出图像的列{遍历输出图像的行{  通过灰度值确定光条像素,计算hessian矩阵,计算嗨森矩阵的特征值和特征向量,选择较大的特征值对应的特征向量,计算亚像素级别的光条中心点,如果亚像素级别的光条中心点在当前像素的邻域内(创建一个原始点,并添加到光线图像点列表中,创建一个亚像素级别的光条中心点,并添加到子像素图像点列表中) }}

使用灰度质心法提取图像中的光条点(输入图像,阈值,输出的光条点,输出的亚像素点,ROI区域的四个角点,是否沿着长边方向提取光条): 声明左上点和右下点,确定ROI区域, 沿行方向提取光条(排除ROI外的点,遍历列(排除ROI外的点 获取当前灰度值,大于阈值则累加灰度值和加权值 ) 计算质心并添加到结果列表);列方向处理,遍历每一列(排除ROI外的点 遍历每一行(排除ROI外的点,获取当前灰度值,累加灰度值和加权值) 计算质心并添加到结果列表)。可选将质心画在原图上(复制输入图像,将图像从灰度转换为RGB,遍历所有亚像素点将质心绘制为红色,将带有质心的图像保存为文件。)

通过最小二乘法拟合抛物线(输入点集,输出 系数):设置拟合的是二次方程,取3则为三次曲线,  获取离散点个数,构造矩阵X,构造Y矩阵,求解系数A。

0836a9ebb0ef883e806a00b2f56390e6.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java中导出Excel导出多个sheet页】

Java中导出Excel导出多个sheet页 序言如何处理多个sheet页的导出期间遇到了一个sheet页相关的问题&#xff0c;以及解决办法多sheet页导出遇到&#xff0c;第二个sheet页的标题名称会把第一个的覆盖的问题 结语 序言 在日常工作中经常有导出数据文件的需求&#xff0c;避免不了…

工具篇:鸿蒙DevEco Studio5.0版本下载及安装

1、下载中心地址 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 2、安装 DevEco Studio支持Windows和macOS系统&#xff0c;下面将针对两种操作系统的软件安装方式分别进行介绍。 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#…

电机驱动知识点总结

一、直流电机入门基础知识 1.直流电机原理 下面是分析直流电机的物理模型图。其中&#xff0c;固定部分有磁铁&#xff0c;这里称作主磁极&#xff1b;固定部分还有电刷。转动部分有环形铁心和绕在环形铁心上的绕组。(其中 2 个小圆圈是为了方便表示该位置上的导体电势或电流…

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理&#xff1a;高性能&#xff08;一&#xff09;从数据库性能优化系统概述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要&#xff1a;本章节介绍查询端到端处理的…

基于STM32F103最小系统板和DL-LN33 2.4G通信 ZigBee无线串口自组网采集温湿度

文章目录 前言一、组网概述二、产品特性三、电气特性四、引脚配置五、UART通信协议5.1 UART参数5.2 包分割5.3 端口5.4 举例通信5.4.1 一个节点给另一个节点发送数据5.4.2 一个节点给另一个节点的内部端口发送数据5.4.3 一个节点给自己的内部端口发送数据5.4.4 不推荐的数据传输…

气膜体育馆的安装流程—轻空间

随着人们对健康生活和高品质运动环境的追求&#xff0c;气膜体育馆因其独特的优点而逐渐受到青睐。轻空间将详细介绍气膜体育馆的安装流程&#xff0c;从实地勘测到检测&#xff0c;再到最终的清理现场&#xff0c;每一步都至关重要&#xff0c;确保体育馆的安全性和功能性。 一…

内网穿透与异地组网强强联合,这款工具屌爆了!!!

在数字化飞速发展的今天&#xff0c;远程访问的需求日益增长&#xff0c;网络已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;远程网络连接的稳定性和安全性往往是我们关注的焦点。节点小宝作为一款创新型的远程管理工具&#xff0c;凭借其使用简单&#xff0c;高速…

RabbitMQ WEB管理端介绍

页面功能概览 Overview(概述)Connections(连接)Channels(通道)Exchanges(交换器)Queues(队列)Admin(用户管理)。 1. Overview(概述) 主要分为三部分 1.1 Queued messages&#xff08;所有队列的消息情况&#xff09; Ready&#xff1a;待消费的消息总数Unacked&#xff1a;待应…

实时美颜技术解析:视频美颜SDK如何改变直播行业

实时美颜技术的出现&#xff0c;尤其是视频美颜SDK的应用&#xff0c;正逐渐改变着直播行业的生态。 一、实时美颜技术的原理 实时美颜技术利用人工智能和图像处理算法&#xff0c;对视频中的人物面部进行优化和修饰。该技术通常包含以下几个步骤&#xff1a; 1.人脸检测和识…

OpenGL->OpenGL环境搭建和配置

OpenGL概述 OpenGL&#xff1a;用于渲染2D、3D矢量图形的APIGLEW&#xff1a;是一个跨平台的C/C库&#xff0c;能够使用更高版本的OpenGL扩展特性GLFW&#xff1a;创建和管理OpenGL上下文&#xff0c;管理渲染窗口&#xff0c;处理输入事件&#xff0c;更轻量GLUT&#xff1a;…

视频格式转换方法:如何使用视频转换器软件转换视频

众所周知&#xff0c;目前存在许多不同的视频和音频格式。但我们的媒体播放器、移动设备、PC 程序等仅兼容少数特定格式。例如&#xff0c;如果不先将其转换为 MP4、MOV 或 M4V 文件&#xff0c;AVI、WMV 或 MKV 文件就无法在 iPhone 上播放。 视频转换器允许您将一种视频格式…

解决微信小程序使用textarea输入框 type=“textarea“ 文本输入限制问题

出现的问题 type"textarea" 这个限制 微信小程序使用textarea , 输入字数大于140 时就输入不进去了 加入这个就解决了 maxlength"-1" <u-inputv-model"queryParams.orderIdTxt"border"true":focus"true":auto-height&q…

【知识学习】阐述Unity3D中Stencil的概念及使用方法示例

在Unity3D中&#xff0c;Stencil&#xff08;模板&#xff09;是一种高级的图形渲染技术&#xff0c;它允许开发者对渲染过程进行精细控制。Stencil Buffer是附加在颜色缓冲区和深度缓冲区之外的另一个缓冲区&#xff0c;它可以用来存储每个像素是否应该被渲染的信息。 Stenci…

自动化物流控制系统WCS应用与异常处理

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 WCS的定义与作用&#xff1a; 物流仓储设备…

探索AIGC治愈系创作:Stable Diffusion 带你轻松复刻某书爆款动漫卡通文案!

hello&#xff0c;大家好我是安琪&#xff01; 情感治愈类一直是受众群体很高非常火爆的赛道&#xff0c;安琪也关注到在某书平台上&#xff0c;漫画治愈类风格的内容也是非常的受欢迎。先来看看以下一些案例 看看这几个账号内容的质量就可以看出该部分内容是很受欢迎的&#x…

论文阅读Vlogger: Make Your Dream A Vlog

摘要 论文介绍了一个名为“Vlogger”的通用人工智能系统&#xff0c;它能够根据用户的描述生成分钟级的视频博客&#xff08;vlog&#xff09;。与通常只有几秒钟的短视频不同&#xff0c;vlog通常包含复杂的故事情节和多样化的场景&#xff0c;这对现有的视频生成方法来说是一…

正版软件 | DupInOut Duplicate Finder:智能清理,让数据井然有序

在信息爆炸的时代&#xff0c;我们经常面临数据管理的挑战。DupInOut Duplicate Finder 是一款专为Windows 设计的重复文件查找工具&#xff0c;帮您快速识别并删除重复的文档、音乐、视频和照片&#xff0c;让您的计算环境更加清洁、有序。 精准查找&#xff0c;一键删除 DupI…

下拉选择输入框(基于elment-ui)

最近在需求中&#xff0c;需要有一个下拉选择功能&#xff0c;又得可以输入&#xff0c;在 element-ui 官网找了&#xff0c;发现没有适合的&#xff0c;然后在修炼 cv 大法的我&#xff0c;也在网上看了一下&#xff0c;但是也都感觉不合适&#xff0c;所以就自己写了一个&…

Todesk远程连接Ubuntu卡100%,以及小窗口打不开

Todesk远程连接Ubuntu卡100%&#xff0c;以及小窗口打不开 使用Todesk远程连接Ubuntu一直卡100%进不去还有todesk里的小悬浮窗打开就会小时&#xff08;小下拉框会消失&#xff09; 使用Todesk远程连接Ubuntu一直卡100%进不去 还有todesk里的小悬浮窗打开就会小时&#xff08;小…

追求准确,还是追求举一反三,聊天机器人智能程度的困境 | Chatopera

在为企业客户上线聊天机器人客服的过程中&#xff0c;总会遇到一个问题&#xff0c;这让用户和我们都感到纠结。 到底是追求让机器人能准确的回答问题&#xff0c;还是让机器人可以举一反三的回答问题。 准确的回答问题&#xff0c;就是不容许回答错了&#xff0c;但是这样机…