- 博客(60)
- 收藏
- 关注
原创 PCL之欧式聚类
RANSAC:根据几何模型找点,例如找平面、直线、圆。欧式聚类:根据空间距离找点,例如找一块连续的点云区域。先用 RANSAC 去掉背景平面再用欧式聚类提取独立目标最后对目标 cluster 做直线、圆、平面等拟合PCL 欧式聚类的本质是:使用 KdTree 快速查找每个点半径范围内的邻居点,然后通过 BFS 或 DFS 找出空间上的连通区域。dpipjrdpipjrpip_ipi和pjp_jpj是两个点;dpipjdpi。
2026-05-26 14:06:29
381
原创 SVD分解与与最小二乘标准式
对于任意一个矩阵AA∈Rm×nAUΣVTU∈Rm×mΣ∈Rm×nV∈Rn×n并且U和VUTUIVTVI也就是说,SVD 可以把任意矩阵AAUΣVTUΣVVTV。
2026-05-13 16:09:24
374
原创 最小二乘中的矩阵求导基础总结
在最小二乘问题中,经常会遇到含有 XTX^TXT 的表达式,例如:XTCX^T CXTCCTXC^T XCTXXTMXX^T M XXTMX∥AX−B∥2\|AX-B\|^2∥AX−B∥2需要注意的是,严格来说,通常不是单独对 XTX^TXT 求导,而是对包含 XTX^TXT 的标量函数进行求导。设:X=[x1x2⋮xn]X=\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}X=x1x2⋮xn如果 f(X)f(X)f(X) 是一个标量函数,那么它对
2026-05-12 22:27:42
365
原创 线性代数之超定方程使用最小二乘求解
在超定方程中, 线性方程组一般不能被完全精确满足,因此需要使用最小二乘法求解参数。都是标量,并且二者相等: (计算两者矩阵维度)因此,正规方程的本质就是:对最小二乘目标函数。求导,并令导数为零后得到的方程。这就是最小二乘法对应的正规方程。可逆时,可以在等式两边左乘。
2026-05-12 22:18:45
424
原创 最小二乘拟合圆心
在实际工程中,一般不直接求矩阵逆,而是使用 SVD 或 QR 分解求解,这样数值稳定性更好。由于边缘点中通常存在噪声,方程组一般不能被完全精确满足,因此需要使用最小二乘方法求解参数。在工程中,可以通过平均误差和最大误差判断该轮廓是否接近圆形。之后,可以恢复圆心坐标。
2026-05-08 19:03:47
360
原创 Canny算子原理-代码
论文中也指出,虽然严格最优算子和一阶高斯导数并不完全相同,但两者性能接近,而一阶高斯导数在二维图像中实现更加高效,所以实验中主要采用该近似形式。论文提出了 feature synthesis,也就是把不同尺度下的检测结果进行综合,用小尺度结果预测大尺度响应,如果实际大尺度响应与预测差异明显,则说明可能存在新的边缘信息。所以 Canny 中的高斯滤波不只是“去噪”,更重要的是控制边缘检测的尺度。如果弱边缘点能够连接到强边缘点,则认为该弱边缘点属于真实边缘,需要保留;为了获得更细的边缘,需要进行非极大值抑制。
2026-05-05 17:24:54
33
原创 PCL之RANSAC
想从一堆点中拟合一条直线想从点云中提取一个平面想从带噪数据中找到主要几何结构如果数据中只有少量高斯噪声,那么最小二乘往往已经够用。但现实工程中,数据里通常还会混入很多外点(outliers)测量误差较大的异常点背景干扰点错误匹配点其他结构上的点浮点噪声或毛刺点这时候,普通最小二乘往往会被这些外点严重带偏。RANSAC(Random Sample Consensus)正是在这种背景下提出的一种经典鲁棒估计方法。在存在大量外点的情况下,仍然找到由主要内点支持的几何模型。
2026-03-27 10:04:03
437
原创 PCL之点云法线原理详解
在三维几何中,法线通常表示某个表面在某一点处的垂直方向。对于理想的连续曲面来说,法线是微分几何意义下的局部几何量。但在点云中,数据是离散采样点,而不是连续曲面,因此点云中的单个点本身并没有天然的法线。点云中的法线不是单个点自带的属性,而是通过该点邻域的局部几何分布估计出来的。这句话非常重要。一个局部量一个邻域统计结果一个描述局部表面方向的量因此,如果脱离邻域谈法线,是没有意义的。最后可以用一段简洁的话总结全文:点云法线不是单个点固有的属性,而是通过该点邻域的局部几何分布估计得到的。
2026-03-26 16:13:01
377
原创 PCL之邻域
因为点云不像图像,图像中的每个像素天然有上下左右的邻居关系,而点云只是空间中的一组离散点,本身并没有规则网格结构。因为后面无论你做法线估计、曲率分析,还是做特征提取、边界判断,都会直接受到这个选择的影响。如果使用最直接的暴力方法,对于点云中的每个点,都去和所有点计算距离,那么计算量会非常大。一个点的几何属性,往往不是由它自己决定,而是由它周围的一小片点共同决定。点云中的法线不是点本身自带的属性,而是通过它周围的一小片点估计出来的。在学习点云处理时, 点云邻域才是很多局部算法的起点。
2026-03-26 14:50:14
335
原创 投影仪标定
在面结构光系统中,很多初学者会先关注相机标定,而忽略投影仪的几何建模。但从三维重建的角度来看,投影仪并不是一个“只负责打光”的设备,而是整个测量系统中的另一个核心几何约束源。(一个相机与一个投影仪的模组, 可以理解为伪双目的结构, 单目具有尺度不确定性,无法进行深度恢复。对于结构光系统,一个非常重要且常用的观点是:投影仪可以被建模为一台“反向相机”。这并不是一种简单的比喻,而是一种严格的几何描述方式。相机的作用是把空间中的三维点投影到图像平面;
2026-03-20 09:45:00
151
原创 论文阅读笔记(一)PointNet
PointNet 通过“共享 MLP + 最大池化”的结构,首次比较系统地实现了对无序点云的直接深度学习,并通过 T-Net 提升了模型对几何变换的鲁棒性,是点云深度学习中的开创性工作。
2026-03-16 15:19:31
109
原创 PnP 几何原理学习(四)
由像点恢复观测方向由空间点恢复真实边长用余弦定理把“边长”和“方向夹角”联系起来先求出光心到三点的距离再恢复相机位姿因此可以把 P3P 概括成一句话:P3P 是通过“空间三角形 + 观测射线三角形”的几何对应关系,先恢复深度,再恢复位姿的方法。
2026-03-12 17:17:31
63
原创 PnP 几何原理学习(三)
平面上的点满足Z_w = 0原本的三维投影关系因此可以简化平面坐标到图像坐标之间可以由一个单应性矩阵描述单应性矩阵和外参之间满足明确的解析关系因此,在平面标定场景下,单应性成为连接“图像观测”和“相机位姿”的关键桥梁。这一部分的核心可以概括为一句话:平面约束使三维投影问题退化成平面射影变换问题,而单应性矩阵正是这个变换的表达形式。
2026-03-12 11:16:32
47
原创 PnP 几何原理学习(二)
每个点都提供了一个方向约束多个点会共同约束同一个相机位姿只有正确的位姿,才能让所有点同时与各自的观测方向保持一致因此,PnP 并不是简单地去“猜一个相机姿态”,而是在寻找一个满足全局一致性的位姿解。归根到底,这部分内容可以概括为一句话:单个点只能提供局部方向信息,而多个点能够共同确定全局一致的相机位姿。
2026-03-12 10:51:17
41
原创 位姿估计之PnP:3D-2D
在学习 OpenCV 中的 或相机标定外参求解之前,需要先把 PnP 背后的几何意义 理清楚。在真正进入 PnP 的算法细节之前,我认为更应该优先掌握下面几个核心内容:这篇文章先对这些内容做一个系统整理。PnP 的核心,本质上是一个 位姿求解问题。而位姿问题最基础的部分,就是先搞清楚各个坐标系之间的关系。世界坐标系也常常可以理解为 物体坐标系 或 标定板坐标系。例如,在棋盘格标定中,通常会把棋盘格左上角定义为原点,然后按照格子边长给出每个角点的三维坐标:Pw=[XwYwZw]P_w =\begin{
2026-03-12 10:15:59
86
原创 OpenCV 相机标定原理完整推导
K=[fxscx0fycy001]K=\begin{bmatrix}f_x & s & c_x\\0 & f_y & c_y\\0 & 0 & 1\end{bmatrix}K=fx00sfy0cxcy1含义:从世界系到相机系:Xc=RXw+t\mathbf X_c = R\mathbf X_w + tXc=RXw+t黑底白圆标定板:OpenCV 输出每个圆心的 2D 像素点。你需要为每个圆心定义对应的 3D 世界坐标(平面板通常取 Z=0Z=0Z=0)。设圆心间距为
2026-02-25 11:17:09
146
原创 相机成像模型(针孔模型 + 畸变模型)
目标:建立从三维点到像素点的映射模型,给后续提供统一公式基础。输出:给定 3D 点Pw(世界坐标)和相机参数(内参、畸变、外参),计算像素点p = (u,v)。
2026-02-24 08:33:08
226
原创 PCL中的描述子
PFH 是“Point Feature Histogram”的缩写,是 PCL 中最核心、也是后续 FPFH 等描述子的理论基础。为使该坐标系唯一,规定。局部描述子是逐点计算的,你给哪个点,它就只描述该点周围的几何长什么样,完全不知道“物体”为何物。把 PFH 的“邻域内全点对两两组合”改成“先算每个点的简化特征 SPFH,再用邻域加权累积”。FPFH 进一步把邻居点自己的 SPFH 纳入进来(近似 PFH 的高阶点对信息)。,把周围的几何信息“打包”带走(因此法线算得不准,描述子质量就会跳水)。
2026-02-03 09:29:21
733
原创 点云配准一
将不同的三维点云数据视图一致地整合为一个完整模型的问题,称为配准。其目的在于确定各独立采集视图在全局坐标系中的相对位置与方向,使得视图间的交叉区域能够完全重合。我们有时将一对点云数据集进行配准的问题称为成对配准,其输出结果通常是一个刚性变换矩阵(4x4)。该矩阵表示需要应用于其中一个数据集(称为源点云)的旋转和平移变换,以使其与另一个数据集(称为目标点云或模型)实现精确对齐。下图展示了成对配准步骤的执行流程。请注意,图中展示的是算法的单次迭代过程。程序员可以根据需求决定循环执行其中任意或全部步骤。
2025-12-13 18:36:56
658
原创 亚像素边缘检测之Canny-Devernay算法
Canny-Devernay算法是一种可以检测亚像素边缘的方法。该方法融合了经典的Canny与Devernay算法的思想。并 通过对原始公式进行改进,提高了亚像素检测精度。
2025-11-05 11:43:49
233
原创 PCL滤波之 StatisticalOutlierRemoval
统计滤波算法是一种利用统计学原理对点云数据进行处理的方法。通过计算点云中每个点的统计特性,例如,均值、方差等来决定是否保留该点。
2025-10-30 10:00:37
216
原创 ORB-SLAM2之ORB特征提取
它的关键点称为“Oriented FAST”,是一种改进的 FAST 角点,什么是 FAST 角点我们将在下文介绍。.BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。为了保持踩点固定,工程上采用特殊设计的固定的pattern来做。通过计算两个描述子的余弦来计算两者的相似性。FAST的思想是,如果一个像素与它邻域的像素差别较大(过亮或过暗), 那它更可能是角点。Harris是一种根据像素点的一阶导数构建结构矩阵判断该点性质的方法。
2025-09-26 17:51:49
691
原创 结构光三维重建之线结构光条纹中心提取
在线结构光视觉传感器中,激光器所释放的线形结构光并非一个单薄的平面,而是具有一定厚度的连续空间光平面。在被测物表面形成的光条纹为激光平面与材料表面相交形成的交线。在激光平面的厚度方向上,光照强度是近似服从高斯分布的。所以,通过CMOS采集获取到的光条纹图像,在沿着光条纹的法线方向上,光条纹的灰度分布也会近似服从高斯分布,即在光条纹的横截面上,越接近光条纹中心区域的像素,灰度值越大,越靠近两侧边缘区域的灰度值越小。
2025-09-17 15:14:36
615
原创 C语言中calloc函数
malloc(num * size) 只分配内存,不做初始化,里面是“脏数据”。calloc(num, size) 分配内存,并把内存 全部初始化为 0。返回值:指向分配内存的指针,如果分配失败返回 NULL。size :每个元素占多少字节。num :要分配多少个元素。
2025-09-04 17:11:59
156
原创 openMVG---安装openMVG
如果可以科学上网,根据官网流程应该就可以一遍成功。安装过程中遇到的问题大部分是网络问题,git clone 子模块时出现的网络错误。方式一: 将github上的代码首先fork到自己的仓库,然后转入码云。然后git码云上的项目。参考https://zhuanlan.zhihu.com/p/380393013。如果中间build过程中出现网络错误,可以多试几次,基本上都能成功。环境:ubuntu 22.04。主要参考文档为官方文档。
2025-08-13 11:14:49
262
原创 VS中将cuda项目编译为DLL并调用
本篇来介绍一下如何将cuda工程编译为DLL, 并在其他工程中调用。配置环境 : VS2022+CUDA12.2, 工程目录如下。
2025-07-04 17:38:05
1193
原创 CUDA编程笔记之-内存模型概述
举个例子,数学公式中的系数就是一个很好的使用常量内存的例子,因为一个线程束中所有的线程使用相同的系数来对不同数据进行相同的计算。如果线程束里每个线程都从不同的地址空间读取数据,并且只读一次,那么常量内存中就不是最佳选择,因为每从一个常量内存中读取一次数据,都会广播给线程束里的所有线程。在CUDA 中内存可以分为两种:一种为可编程的(需要显式的控制哪些数据存放在可编程区域), 一种为不可编程的(不能决定数据的存放位置,程序将自动生成存放位置以获得良好的性能)。每一个SM都有一定数量的由线程块分配的共享内存。
2025-06-26 14:07:34
556
原创 CUDA编程之-分支分化(并行规约)
鉴于加法的结合律和交换律,数组元素可以以任何顺序求和。那么如果使得一部分线程束跑满, 另一部分线程束不做运算, 避免线程束内的分化,是不是就可以提升代码效率。在该核函数中, 第一次循环中每个线程束内存在一半的线程未执行, 造成线程数的分化, 降低了运行效率。注: 该核函数只是求每个block 中的和, 并将数据放在idata中的第一个元素中。假设要对一个有N个元素的整数数组求和, 可以使用如下代码在host端进行求和。3.对每个数据块的部分和再求和得出最终结果。2.用一个线程计算一个数据块的部分和。
2025-06-19 15:47:19
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅