- 博客(47)
- 收藏
- 关注
原创 ICP点云配准初探
在逆向工程,计算机视觉,文物数字化等领域中,由于点云的不完整,旋转错位,平移错位等,使得要得到的完整的点云就需要对局部点云进行配准;为了得到被测物体的完整数据模型,需要确定一个合适的坐标系,将从各个视角得到的点集合并到统一的坐标系下形成一个完整的点云,然后就可以方便进行可视化的操作,这就是点云数据的配准。点云配准的应用还有很多。比如:形状还原运动估计外观分析纹理映射追踪等等那么点云配准的本质是什么呢?
2024-04-27 11:18:21
755
原创 点云及点云拓扑结构
k-d tree( k-dimensional tree)是计算机科学中用于在k维空间中一些点建立关系的数据结构。它是一个包含特定约束的二叉搜索树。k-d tree对于范围搜索和最近邻居搜索非常有用。我们通常只处理三维空间的点云,因此我们所有的k-d树都是三维空间的。k-d树的每个级别都使用垂直于相应轴的超平面沿特定维度拆分所有子级。在树的根部,所有子项都将根据第一维进行拆分(即,如果第一维坐标小于根,则它将位于左子树中,如果大于根,则显然位于右边的子树)。
2024-04-21 10:44:25
1151
原创 点云配准概述
经过粗配准之后,这两个点云的重合程度已经很高了,若要进一步提高,就需要后续的精准配准,现在一般都是采用ICP(迭代最近点)算法或者其变种来进行的,通过多次迭代,可以进一步提高配准的精度,但是若是没有粗配准提供较好的迭代初始位置,ICP算法往往会陷入局部区域的最优解,而得不到全局的最优解。在点云数据只有三维坐标时进行配准,这个时候,我们所能提取到的就只有点云的几何特征,常用的特征包括,点云的曲率,点云中平面四边形的仿射不变性等特征。点云配准是将原始点云和目标点云进行对齐。首先,稍微总结下点云配准吧。
2024-04-20 20:23:53
214
原创 4PCS、super4PCS粗配准算法
RANSAC 配准算法。通过找出目标点云和原始点云中对应的两组点进行旋转平移求解出T,然后在众多的候选T中旋转一组最大重合的T,都是具有随机性和假设性。区别在于:只是怎么找出对应点方法不一样,RANSAC一般通过特征点及描述子去找对应点,而4PCS则是通过对应的同一平面四点组仿射不变性去找。该方法适用于重叠区域较小或者重叠区域发生较大变化场景点云配准,无需对输入数据进行预滤波和去噪,算法能够快速准确的完成点云配准。
2024-04-20 20:03:34
721
原创 RANSAC 配准算法
先讲一下背景吧。点云配准(Point Cloud Registration)指的是输入两幅点云 (source 和 target) ,输出一个变换使得变换后的source和target的重合程度尽可能高。点云配准可以分为粗配准(Coarse Registration)和精配准(Fine Registration)两步。粗配准指的是在两幅点云之间的变换完全未知的情况下进行较为粗糙的配准,目的主要是为精配准提供较好的变换初值;精配准则是给定一个初始变换,进一步优化得到更精确的变换。
2024-04-20 11:32:37
1801
原创 Marching Cubes算法
在学习网格生成算法之前,推荐大家先了解Marching Cube(MC)算法,为什么呢,他也不是一个端到端的网格生成算法?因为很多连续算法在最后提取等值面的时候都会采用marching cube或其改进版本,可以说MC算法是很多算法的后处理。如果不理解这一步怎么做的,也很难理解其他算法之前的那么多计算的目的是什么。除此之外可以大大简化其他算法的解释过程,最后一步,就可以忽略不解释了。所以我们大家开始吧。在解释MC算法前,我们先来解释一下等值面。等值面是什么?
2024-04-19 10:24:56
1571
原创 网格(mesh)生成算法
基于 3D视觉的新兴应用场景蓬勃发展,3D点云越来越受到人们的广泛关注。点云有着广泛的应用领域包括机器人技术、3D图形、自动驾驶、虚拟现实(AR/VR/MR)等。为了跟上不断增长的应用需要,研究和开发有效存储、处理的相关算法来处理点云的意义正显著上升。点云(Point cloud):由N个D维的点组成,当这个D=3的时候一般代表着(x,y,z)的坐标,当然也可以包括一些法向量、强度等别的特征。与网格、体素等数据形式类似,点云也常用作描述三维模型,其表现非常直观,且具有无序性和不规则性。
2024-04-14 11:52:56
1929
原创 常见点云文件解析
最后一行是结束标志。我们在做2D视觉时,处理的就是类似一系列类似的二维数组,数组以图片的形式进行保存,处理的图片也有甚多的格式,比如png,jpg,bmp等。那我们在做3D视觉的时候,处理的主要是点云,点云就是由一些点的集合。一般由深度图还原的点云,有序点云按照图方阵一行一行的,从左上角到右下角排列,当然其中有一些无效点。有序点云在某些处理的时候还是很便利的,但是很多情况下是无法获取有序点云的。无序点云就是其中的点的集合,点排列之间没有任何顺序,点的顺序交换后没有任何影响,是比较普遍的点云形式。
2024-04-13 22:47:10
1199
原创 3D视觉技术
3D视觉是一个多学科相融合的技术,可以总结为:计算图形学+计算机视觉+人工智能=3D视觉。3D视觉技术是通过3D摄像头采集视野空间内每个点位的三维座标信息,通过算法复原获取三维立体成像,不会轻易受到外界环境、复杂光线的影响,与2D成像技术相比更稳定,体验感更强,安全性更高。3D视觉是一个范围较广的概念,涉及到硬件选型、离散数学、非线性优化、最优化理论、矩阵论、多视图几何、空间变换、点云处理、计算机视觉、SLAM、深度学习等相关知识点,
2024-04-13 22:10:07
243
原创 人体姿态估计算法
人体姿态估计(Human Pose Estimation, HPE)是一种识别和分类人体关节的方法。本质上,它是一种捕获每个关节(手臂、头部、躯干等)的一组坐标的方法,该坐标被称为可以描述人的姿势的关键点(keypoint)。这三种类型是随着应用逐步发展出来的,先检测关键点,类似于火柴人,进一步的检测出人的轮廓,再根据轮廓进一步的把人体进行3D重建。也称为运动学模型,该模型包括一组关键点(关节),例如脚踝、膝盖、肩膀、肘部、手腕和肢体方向,主要用于 3D 和 2D 姿势估计。
2023-12-03 15:21:44
2958
原创 深入浅出OpenGL三维渲染管线
OpenGL渲染实际上就是将3D坐标进行系列转换变为2D坐标,整个流程如下:除此之外,为了让最终结果和实际物体更接近, 会进行打光和贴纹理等操作。
2023-04-16 11:49:46
795
1
原创 目标检测算法的评价指标
对于一个目标检测模型的好坏,总的来说可以从以下三个方面来评估:严格说某些场合也会很在意模型的大小,这也是一个研究方向,比如 , , 等。所以除了上面三个维度,模型的大小也可以是一个评价维度。PASCAL VOC 挑战赛:该挑战赛目标检测评价指标官方文档,当前 PASCAL VOC 目标检测挑战赛使用的指标是曲线和.COCO 检测挑战赛:该挑战赛使用不同的指标来评估不同算法的目标检测准确性。 这里可以找到 COCO 上的目标检测性能的 12 个指标的文档。Google Open Images Dataset
2022-06-12 18:07:09
2577
1
原创 批量读取路径下的文件名并保存在txt文件里
import osdef ListFilesToTxt(dir, file, wildcard, recursion): exts = wildcard.split(" ") files = os.listdir(dir) for name in files: fullname = os.path.join(dir, name) if (os.path.isdir(fullname) & recursion): Li
2022-04-23 12:42:22
664
原创 目标检测算法基础
人脸检测算法综述0 前言1 人脸检测算法难点2 人脸检测算法流程2.1 选择检测窗口2.2 提取图像特征2 人脸检测算法2.1 早期算法2.2 AdaBoost框架2.3 深度学习0 前言人脸检测是目标检测的其中一个方向,它在安防监控、人证比对、人机交互、社交和娱乐等方面有很强的应用价值,也是人脸识别算法、人脸关键点检测算法、人脸位姿估计算法等的第一步。人脸检测任务关注的是图像中人脸的位置,包含了两个子任务:其一是输出这一目标的类别信息,属于分类任务;其二是输出目标的具体位置信息,属于定位任务。1
2022-04-23 12:35:51
4073
原创 函数参数传递机制
函数参数传递机制1 函数参数传递机制2 值传递、址传递和引用传递的区别2.1 功能上2.2 传递效率上2.3 执行效率上2.4 类型安全上2.5 参数检查上2.6 灵活性上3 函数传递该用指针还是引用1 函数参数传递机制函数参数传递机制问题本质上是调用函数和被调用函数在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。在值传递过程中, 被调用的函数(简称被调函数)的形式参数(简称为形参)作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由调用其他函数的函数(简称为主调函
2022-03-23 22:39:41
1893
1
原创 避免使用宏#define定义常量
避免使用宏#define定义常量1 前言2 使用const而不是#define定义常量3 总结1 前言C/C++预处理器提供了一系列的编译指令,通常,C++惯例是使用这些编译指令来惯例编译过程。例如,#include编译指令是管理程序文件的重要组件其他编译指令(#ifndef和#endif)使得能够控制是否对特定的代码块进行编译#pragma编译指令使得能够控制编译器特定的编译选项这些都是非常有帮助的工具,但使用#define编译指令时要谨慎。2 使用const而不是#define定义常
2022-03-20 09:12:47
1443
原创 size_t数据类型的意义
size_t数据类型的意义1 `int`的各种类型和`size_t`类型2 size_t类型的意义3 总结4 参考1 int的各种类型和size_t类型数据类型特别是int相关的类型(int,long, long long)在不同位数系统下长度不同,如下所示,特别是long数据类型,在不同平台下字节数就不一样,为了保证平台的通用性,程序中尽量不要使用long数据类型。//32位系统char 1个字节8位short 2个字节16位int 4个字节32位long 4个字节long long 8个
2022-03-19 20:15:18
2499
1
原创 static关键字用法
static关键字用法1 static关键字2 为什么要引入static3 C/C++中static的作用4 C++中static的用法4.1 面向过程设计中的static4.1.1 静态全局变量4.1.2 静态局部变量4.1.3 静态函数4.2 面向对象程序设计中的`static`(类中的`static`关键字)4.2.1 静态数据成员4.2.2 静态成员函数1 static关键字2 为什么要引入static我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上
2022-03-16 23:16:26
746
原创 C++内存分配
C++内存分配和static关键字用法1 内存分配方式2 堆和栈的区别3 尽量少使用全局变量4 static关键字4.1 为什么要引入static4.2 C/C++中static的作用4.3 C++中static的用法4.3.1 面向过程设计中的static4.3.1.1 静态全局变量4.3.1.2 静态局部变量4.3.1.3 静态函数4.3.2 面向对象程序设计中的`static`(类中的`static`关键字)4.3.2.1 静态数据成员4.3.2.2 静态成员函数1 内存分配方式在C++中,内存分
2022-03-16 23:08:38
2191
原创 `LINK : fatal error LNK1104: 无法打开文件“***.dll”`的问题解决
问题描述: 我在编译动态链接库的项目时候,就报了如下的错误:LINK : fatal error LNK1104: 无法打开文件“..\bin\InitProject.dll”而InitProject.dll就是我目前需要输出的,但是却报无法打开该动态链接库错误。问题分析: ..\bin路径下已经有了InitProject.dll,如果重新进行编译,则会把之前的InitProject.dll删掉,再重新生成一个InitProject.dll。如果无法打开该动态链接库,会不会是因为其他程序占用了该动态
2022-03-15 21:10:11
8001
1
原创 指针变量未初始化导致程序崩溃
问题描述: 在功能自测的时候发生程序崩溃,在调试的过程将问题定位到崩溃是在操作指针的地方。代码示例如下:if (ptr != nullptr){ delete ptr; ptr = nullptr;}崩溃在ptr = nullptr;这一行代码上,而我前面定义了该指针int* ptr;并未对其进行new相关的操作和初始化,那既然ptr并不是nullptr,那为何delete该指针后会导致程序崩溃呢?原因分析: delete指针操作只是释放指针原本所指的内存,并没有删除该指针,如果该指针没有进
2022-03-15 21:07:40
1659
原创 C++文件操作和文件流
C++文件操作和文件流1文件的概念2 文件流的分类2 打开文件2.1 通过类对象调用`open`函数打开一个文件2.2 通过类对象构造函数打开文件3 关闭文件4 读写文件4.1 文本文件的读写4.2 二进制文件的读写1文件的概念根据文件中数据的组织方式,可以将文件分为文本文件和二进制文件。文本文件:又称字符文件或ASCII文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件:又称内部格式文件或字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘中存放。比如:数字 64
2022-03-10 20:47:16
2957
原创 DLL导出函数和类
1 基本概念1.1 动态链接库库是写好的现有的,并且可以复用的代码。现实开发中每个程序都要依赖很多基础的底层库,不可能每个功能都从零开始开发,因此库是必须存在的。库的本质是一种可执行的二进制文件,可以被操作系统加载到内存中执行,库有两种:静态链接库(简称为静态库)和动态链接库(简称为动态库),所谓静态、动态是指链接,一个程序编译成可执行文件步骤如下图所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgwmgSGt-1646739553600)(img\编译过程.PN
2022-03-08 19:39:49
6055
原创 智能指针shared_ptr的原理、用法和注意事项
智能指针shared_ptr的原理、用法和注意事项1 前言2 shared_ptr原理3 share_ptr的基本用法3.1 初始化3.2 获取原始指针3.3 指定删除器4 使用share_ptr需要注意的问题1 前言在实际的C++开发过程中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用的内存越来越多最终不得不重启等问题,这些问题往往都是内存管理资源不当造成的。比如:①有些内存资源已经释放,但指向它的指针并没有改变指向,最终称为了野指针,并且后续还在使用;②有些内存资源已经被释放,后期又试图再
2022-03-05 19:52:25
8418
原创 【c++】如何让一个对象只在栈(堆)上分配内存
在c++中,类的对象建立分为两种,一种是静态建立,比如A a;另一种是动态建立,比如A* ptr = new A;这两种方式是有区别的。静态建立类对象: 是由编译器为对象在栈空间中分配内存,通过移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。这种方式是直接调用类的构造函数。动态建立类对象: 是用new关键字将对象建立在堆空间上,这个过程分两步走。首先是执行 operator new() 函数,在堆空间上搜索合适的内存并分配;第二步是调用构造函数构造对象,初始化这片
2022-02-24 20:47:33
3008
3
原创 C++ delete指针需置空
delete指针之后,一定要给指针赋值为空,不然会引起程序崩溃。T* p = new T();delete p;// ...p->func(); // crashif (p) { p->func(); // crash too}以上代码,因为指向的内存已经被释放,导致后面的调用失效,这种情况导致程序崩溃的原因会非常难找,而且出错的位置很难定位,开发时往往还容易遇到很多这种情况。那么delete到底做了什么动作呢?delete指针只是释放了那个指针原本所指的内存而已,并没
2022-02-23 23:42:16
7187
3
原创 深入浅出梯度下降算法背后的数学原理
深入浅出梯度下降算法背后的数学原理0 前言1 什么是梯度?2 梯度下降是如何工作的?2.1 从生活中的一个小例子讲起2.2 什么是成本函数2.3 如何最小化成本函数2.4 什么是梯度下降2.5 成本函数的数学解释3 学习率4 如何确保梯度下降能够正常工作5 梯度下降算法的python实现6 梯度下降的类型6.1 批量梯度下降6.2 随机梯度下降6.3 小批量梯度下降0 前言梯度下降是一种在训练机器学习模型时使用的优化算法,它基于凸函数并迭代调整其参数以将给定函数最小化到其局部最小值。什么是梯度下降?
2022-02-09 21:35:01
2000
原创 如何选择优化算法
如何选择优化算法0 前言1 优化算法2 可微的目标函数2.1 Bracketing Algorithms2.2 Local Descent Algorithms2.3 First-Order Algorithms2.4 Second-Order Algorithms3 不可微的目标函数3.1 Direct Algorithms3.2 Stochastic Algorithms3.3 Population Algorithms4 summary0 前言优化是找到目标函数一组输入的问题,这是机器学习算
2022-02-08 11:49:06
4269
原创 [机器学习] 梯度下降优化算法
[机器学习] 梯度下降优化算法前言常见的梯度下降优化算法Gradient DescentStochastic Gradient Descent (SGD)SGD with momentumAdaptive Gradient (AdaGrad)RMSpropAdam什么是机器学习中最佳优化算法前言为什么需要更好的优化算法?在训练神经网络模型中,通常需要定义一个损失函数来衡量我们模型的预测结果和标签之间的差异。θi←θi−η▽θiL(θ)\theta _{i}\gets \theta _{i} - \
2022-02-07 14:23:08
2087
原创 奇异值分解(SVD)
奇异值分解SVD什么是奇异值分解SVD的特征向量SVD定义应用什么是奇异值分解SVD是一种矩阵分解算法,在某些情况下,矩阵具有特定的结构,如果矩阵中有规则或简单的结构,那么分解矩阵将是有意义的。先看以下几个例子:例子1.以下是一个所有元素值都相等的矩阵A=(111111111111111111111111111111111111)A=\begin{pmatrix}1 &1 &1 &1 &1 &1 \\ 1 &1 &1 &
2021-08-29 20:16:41
8300
3
原创 机器学习中的线性代数基础
文章目录机器学习基础的线性代数举个栗子统计领域的线性代数矩阵和图像机器学习基础的线性代数在机器学习中,大多数数据通常表示为向量、矩阵或张量,因此机器学习在很大程度上依赖于线性代数。先了解下向量、矩阵和张量:向量是一维数组,具有大小和方向矩阵是二维数组,具有固定的行和列,一般用方括号[ ]表示张量是向量和矩阵的推广,比如一维张量是一个向量,二维张量是一个矩阵,RGB图像是三维张量,当然还可以扩展到四维张量以及更高维等描述矩阵的一些基本术语有:(如下图所示)方阵:nxn,即行数等于列数对角
2021-08-29 15:19:06
539
原创 批量测试结果保存txt文件
有的时候做完批量测试后,想将编译器控制台输出的结果保存为txt文件,通常可以这么做:在windows环境下,找到编译后生成的exe文件,在该目录下,输入cmd,再回车,如下所示:然后再把exe文件拖到cmd下,如下图所示,我的是在D盘,在exe后面加上“> result.txt”,这样就会把控制台输出的内容都保存在result.txt文件里。...
2021-07-30 23:17:49
461
原创 医学图像NIFTI(.nii)转换为mhd、raw文件格式
文章目录NIFTI(.nii)文件格式mhd、raw文件格式python代码实现NIFTI(.nii)文件格式Nifti 格式最初是为神经影像学发明的。神经影像信息学技术计划(NIFTI)将 NIfTI 格式预设为 ANALYZE7.5 格式的替代品。它最初的应用领域是神经影像,但是也被用在其他领域。这种格式的主要特点就是它包含两个能够将每个体素的索引(i,j,k)和它的空间位置(x,y,z)关联起来的仿射坐标。NIFTI文件更加易用于机器学习,因为NIfTI 是三维图像,处理一个单独的NIfTI 文
2021-07-30 23:01:25
2456
1
原创 PCA (Principal Component Analysis)主成分分析
文章目录简介PCA原理基础概念PCA思想summary简介通常来说,数据是机器学习PCA原理基础概念PCA思想summary
2021-07-25 16:59:09
1397
原创 深入浅出极大似然估计
首先,举个生活中的一个小栗子,假设现在有一个盒子,里面有黑白两种颜色的球,数目未知且颜色的比例未知,现从盒子里随机抽取一个球,并记录它的颜色,然后再把球放回盒子里,再取。总共取了20次,通过统计发现有6个白球,14个黑球。你通过直觉认为这个盒子里白球占的比例为6/20,黑色球所占的比例为14/20。而这仅仅是直觉,是你的猜想,但是在数学这门学科,它是严谨的,是需要理论支撑的,因此我们希望用一些理论去支撑我们的猜想和直觉,用这些理论去估计概率,然后分析其偏差和方差。而这里我们经常用的理论就是极大似然估计。
2021-07-12 23:06:35
248
原创 浅谈欧拉公式
文章目录欧拉公式的推导欧拉公式的意义欧拉公式是数学里最令人着迷的公式之一,它将指数函数的定义域扩大到复数域,建立了指数函数和三角函数的关系。欧拉公式的表达式为:eiθ=cosθ+isinθe^{i\theta }=cos\theta+isin\thetaeiθ=cosθ+isinθ欧拉公式的推导在推导之前,首先了解级数的概念级数,指将数列的项依次用加号连接起来的函数一般形式为:∑i=1∞ai=a1+a2+...\sum_{i=1}^{\infty }a_{i}=a_{1}+a_{2}+
2021-07-11 21:33:32
1639
原创 高斯分布&正态分布
文章目录高斯分布定义高斯分布意义高斯分布的证明多元高斯分布高斯分布又叫正态分布,是统计学中最重要的连续概率分布。研究表明,在物理科学和经济学中,大量数据的分布通常是服从高斯分布,所以当我们对数据潜在分布模式不清楚时,可以优先用高斯分布近似或精确描述。遵循高斯分布的随机变量是假设在给定范围内的任何值,比如某小学学校学生的身高,它可以取任何值,但是会限制在0到2米范围内,这个限制是根据实际生活中强加的,但是在高斯分布中,没有随机变量这个范围限制,可以扩展到整个实数范围内,最终会得到一个很好的平滑曲线,这样的
2021-07-11 19:05:57
37709
1
原创 图像归一化处理
文章目录前言1.min-max归一化2.Z-score归一化前言在医学图像领域,由于不同设备的采集、成像因素等原因造成相同的组织在图像灰度信息上的不一致,图像归一化就是在保留具有诊断价值的灰度差异的同时,减小甚至消除图像中灰度不一致而进行的图像转换方法,图像的归一化更有利于计算机自动分析处理。因此,图像归一化就是通过一系列的变换,将待处理的原始图像转换成相应的标准形式。下面将介绍两种常见的归一化方法,并展示相应的python代码。1.min-max归一化通过遍历图像矩阵中的每一个像素,设定max和
2021-07-07 21:40:19
10354
3
原创 统计学习方法学习笔记(一)
文章目录1 统计学习及监督学习1.1 统计学习1.2 统计学习的分类1.3 统计学习方法的三要素1.4 模型估计与模型选择1.5 正则化与交叉验证1.6 泛化能力1.7 生成模型与判别模型1.8 监督学习应用1 统计学习及监督学习1.1 统计学习定义:是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。通俗易懂地说,统计学习是运用一系列工具对数据进行分析建模,因此它研究的对象是数据,研究目的是预测与分析。即从数据出发,提取数据的特征,抽象出数据模型,发现数据中的知识,又回到
2021-07-06 22:15:13
579
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人