PFH算法原理

三维向量的叉积

两个向量的叉积是一个向量,它具有以下特性和几何意义:


1. 定义

假设两个三维向量 a \mathbf{a} a b \mathbf{b} b,它们的叉积(或向量积)定义为:
c = a × b \mathbf{c} = \mathbf{a} \times \mathbf{b} c=a×b
其计算公式为:
c = ∣ i j k a x a y a z b x b y b z ∣ = i ( a y b z − a z b y ) − j ( a x b z − a z b x ) + k ( a x b y − a y b x ) c=∣ijkaxayazbxbybz∣=i(aybz−azby)−j(axbz−azbx)+k(axby−aybx) c=∣ijkaxayazbxbybz∣=i(aybzazby)j(axbzazbx)+k(axbyaybx)

c = ∣ i j k a x a y a z b x b y b z ∣ = i ( a y b z − a z b y ) − j ( a x b z − a z b x ) + k ( a x b y − a y b x ) \mathbf{c} = \begin{vmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ a_x & a_y & a_z \\ b_x & b_y & b_z \end{vmatrix} = \mathbf{i}(a_y b_z - a_z b_y) - \mathbf{j}(a_x b_z - a_z b_x) + \mathbf{k}(a_x b_y - a_y b_x) c= iaxbxjaybykazbz =i(aybzazby)j(axbzazbx)+k(axbyaybx)

其中 i , j , k \mathbf{i}, \mathbf{j}, \mathbf{k} i,j,k 是单位向量。

  • a = ( a x , a y , a z ) \mathbf{a} = (a_x, a_y, a_z) a=(ax,ay,az)
  • b = ( b x , b y , b z ) \mathbf{b} = (b_x, b_y, b_z) b=(bx,by,bz)
  • c = ( c x , c y , c z ) \mathbf{c} = (c_x, c_y, c_z) c=(cx,cy,cz)

2. 几何意义

  • 方向:
    c \mathbf{c} c 的方向垂直于 a \mathbf{a} a b \mathbf{b} b 所在的平面(符合右手定则)。
    • 右手定则:
      如果右手的四指从 a \mathbf{a} a 的方向弯向 b \mathbf{b} b 的方向,则大拇指的方向就是 a × b \mathbf{a} \times \mathbf{b} a×b 的方向。
  • 大小:
    ∣ c ∣ = ∣ a × b ∣ = ∣ a ∣ ∣ b ∣ sin ⁡ θ |\mathbf{c}| = |\mathbf{a} \times \mathbf{b}| = |\mathbf{a}| |\mathbf{b}| \sin\theta c=a×b=a∣∣bsinθ
    其中 θ \theta θ a \mathbf{a} a b \mathbf{b} b 之间的夹角。
    • sin ⁡ θ = 0 \sin\theta = 0 sinθ=0 时( a \mathbf{a} a b \mathbf{b} b 平行或反平行),叉积为零向量。
    • sin ⁡ θ = 1 \sin\theta = 1 sinθ=1 时( a \mathbf{a} a b \mathbf{b} b 垂直),叉积大小最大。

3. 物理意义

  • 垂直向量:
    叉积 a × b \mathbf{a} \times \mathbf{b} a×b 得到的向量 c \mathbf{c} c 是垂直于 a \mathbf{a} a b \mathbf{b} b 的平面法向量。
  • 平行四边形面积:
    ∣ a × b ∣ |\mathbf{a} \times \mathbf{b}| a×b 的大小等于由 a \mathbf{a} a b \mathbf{b} b 作为邻边构成的平行四边形的面积。

4. 性质

  1. 反对称性:
    a × b = − ( b × a ) \mathbf{a} \times \mathbf{b} = -(\mathbf{b} \times \mathbf{a}) a×b=(b×a)

  2. 分配律:
    a × ( b + c ) = ( a × b ) + ( a × c ) \mathbf{a} \times (\mathbf{b} + \mathbf{c}) = (\mathbf{a} \times \mathbf{b}) + (\mathbf{a} \times \mathbf{c}) a×(b+c)=(a×b)+(a×c)

  3. 与标量的关系:
    如果 k k k 是标量:
    ( k a ) × b = k ( a × b ) (k\mathbf{a}) \times \mathbf{b} = k(\mathbf{a} \times \mathbf{b}) (ka)×b=k(a×b)

  4. 与自身的叉积:
    a × a = 0 \mathbf{a} \times \mathbf{a} = \mathbf{0} a×a=0
    因为任何向量与自身平行, sin ⁡ θ = 0 \sin\theta = 0 sinθ=0

    因为任何向量与自身平行, sin ⁡ θ = 0 \sin\theta = 0 sinθ=0


5. 在实际应用中的例子

  • 法向量计算:
    在计算一个平面或三角形的法向量时,用叉积得到垂直于平面的向量。

  • 力矩:
    力矩 τ \mathbf{\tau} τ 是力 F \mathbf{F} F 关于旋转轴的位置向量 r \mathbf{r} r 的叉积:
    τ = r × F \mathbf{\tau} = \mathbf{r} \times \mathbf{F} τ=r×F
    力矩的大小与力、作用点到旋转轴的距离,以及它们的夹角有关。

    力矩的大小与力、作用点到旋转轴的距离,以及它们的夹角有关。

  • 角动量:
    角动量 L \mathbf{L} L 是位置向量 r \mathbf{r} r 和动量 p \mathbf{p} p 的叉积:
    L = r × p \mathbf{L} = \mathbf{r} \times \mathbf{p} L=r×p


总结

两个向量的叉积产生了一个垂直于原向量所在平面的向量,其大小反映了这两个向量围成的平行四边形的面积。它是描述向量间几何关系的有力工具,广泛用于物理和计算机图形学等领域。




向量到平面的投影

计算一个向量到某一个平面的投影向量,涉及到向量投影和正交分解的概念。假设我们有一个向量 v \mathbf{v} v,需要将它投影到一个平面 Π \Pi Π 上,平面的法向量为 n \mathbf{n} n

公式推导

1. 向量的分解

将向量 v \mathbf{v} v 分解为:

  • 平行于法向量 n \mathbf{n} n 的分量 v ∥ \mathbf{v}_\parallel v
  • 平行于平面 Π \Pi Π 的分量(即投影向量) v ⊥ \mathbf{v}_\perp v

v = v ∥ + v ⊥ \mathbf{v} = \mathbf{v}_\parallel + \mathbf{v}_\perp v=v+v

2. 计算平行于法向量的分量

平行于法向量 n \mathbf{n} n 的分量是 v \mathbf{v} v n \mathbf{n} n 方向上的投影:
v ∥ = v ⋅ n ∥ n ∥ 2 n \mathbf{v}_\parallel = \frac{\mathbf{v} \cdot \mathbf{n}}{\|\mathbf{n}\|^2} \mathbf{n} v=n2vnn

3. 计算投影向量

投影向量 v ⊥ \mathbf{v}_\perp v v \mathbf{v} v 减去平行分量:
v ⊥ = v − v ∥ \mathbf{v}_\perp = \mathbf{v} - \mathbf{v}_\parallel v=vv
v ∥ \mathbf{v}_\parallel v 代入上式:
v ⊥ = v − v ⋅ n ∥ n ∥ 2 n \mathbf{v}_\perp = \mathbf{v} - \frac{\mathbf{v} \cdot \mathbf{n}}{\|\mathbf{n}\|^2} \mathbf{n} v=vn2vnn

4. 最终结果

v 投影 = v ⊥ = v − v ⋅ n ∥ n ∥ 2 n \mathbf{v}_\text{投影} = \mathbf{v}_\perp = \mathbf{v} - \frac{\mathbf{v} \cdot \mathbf{n}}{\|\mathbf{n}\|^2} \mathbf{n} v投影=v=vn2vnn

向量投影示意图

若需要进一步可视化,我可以绘制一张图展示 v \mathbf{v} v 在平面上的投影关系。


示例计算

假设:

  • v = ( 3 , 4 , 5 ) \mathbf{v} = (3, 4, 5) v=(3,4,5)
  • 平面法向量 n = ( 0 , 0 , 1 ) \mathbf{n} = (0, 0, 1) n=(0,0,1)

步骤:

  1. 计算点积 v ⋅ n \mathbf{v} \cdot \mathbf{n} vn:
    v ⋅ n = 3 ⋅ 0 + 4 ⋅ 0 + 5 ⋅ 1 = 5 \mathbf{v} \cdot \mathbf{n} = 3 \cdot 0 + 4 \cdot 0 + 5 \cdot 1 = 5 vn=30+40+51=5

  2. 计算法向量的模长平方 ∣ n ∣ 2 |\mathbf{n}|^2 n2:
    ∥ n ∥ 2 = 0 2 + 0 2 + 1 2 = 1 \|\mathbf{n}\|^2 = 0^2 + 0^2 + 1^2 = 1 n2=02+02+12=1

  3. 计算平行分量 v ∥ \mathbf{v}_\parallel v:
    v ∥ = 5 1 ( 0 , 0 , 1 ) = ( 0 , 0 , 5 ) \mathbf{v}_\parallel = \frac{5}{1}(0, 0, 1) = (0, 0, 5) v=15(0,0,1)=(0,0,5)

  4. 计算投影向量 v ⊥ \mathbf{v}_\perp v:
    v ⊥ = v − v ∥ = ( 3 , 4 , 5 ) − ( 0 , 0 , 5 ) = ( 3 , 4 , 0 ) \mathbf{v}_\perp = \mathbf{v} - \mathbf{v}_\parallel = (3, 4, 5) - (0, 0, 5) = (3, 4, 0) v=vv=(3,4,5)(0,0,5)=(3,4,0)

最终结果:
v 投影 = ( 3 , 4 , 0 ) \mathbf{v}_\text{投影} = (3, 4, 0) v投影=(3,4,0)


PFH (Point Feature Histogram) 是一种常用的三维点云特征描述子,专门用于点云中的关键点描述和特征提取。它是一种基于几何关系的描述子,用于捕获点云局部几何特征。PFH 描述子广泛应用于三维点云的配准、物体识别和分类等任务中。




PFH 的基本概念

PFH 描述子通过计算目标点与其邻域点的几何关系,生成一个高维直方图来表示该点的局部特征。它包含了以下步骤:

  1. 邻域搜索:
    对目标点查找其邻域内的所有点(通常通过半径搜索或 k 近邻搜索)。
  2. 局部坐标系定义:
    对于目标点 p i p_i pi 和其邻域中的每一个点 p j p_j pj,定义一个局部坐标系来描述两点之间的几何关系。
  3. 几何特征计算:
    在局部坐标系中,计算两点之间的几何特征,主要包括:
    • α \alpha α (alpha): 描述点对之间的角度偏差;
    • ϕ \phi ϕ (phi): 法向量的角度关系;
    • θ \theta θ (theta): 点对向量与法向量的夹角。
  4. 特征直方图构建:
    将计算得到的几何特征 ( α , ϕ , θ \alpha, \phi, \theta α,ϕ,θ) 分别量化为直方图的不同维度。最后将这些直方图组合成一个高维直方图,作为目标点的描述子。

PFH 描述子的公式

对于每对点 ( p i , p j ) (p_i, p_j) (pi,pj),定义以下几何关系:

  1. 向量定义:
    • d = p j − p i \mathbf{d} = \mathbf{p}_j - \mathbf{p}_i d=pjpi,为两点之间的方向向量。
    • n i , n j \mathbf{n}_i, \mathbf{n}_j ni,nj 为点 p i , p j p_i, p_j pi,pj 的法向量。
  2. 几何特征:
    • α = arctan ⁡ ( n j ⋅ ( d × n i ) d ⋅ n i ) \alpha = \arctan \left( \frac{\mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i)}{\mathbf{d} \cdot \mathbf{n}_i} \right) α=arctan(dninj(d×ni))
    • ϕ = arccos ⁡ ( n i ⋅ d ) \phi = \arccos (\mathbf{n}_i \cdot \mathbf{d}) ϕ=arccos(nid)
    • θ = arccos ⁡ ( n i ⋅ n j ) \theta = \arccos (\mathbf{n}_i \cdot \mathbf{n}_j) θ=arccos(ninj)
  3. 直方图构建: 将这些几何特征投影到直方图中,生成固定维度的特征描述子。

PFH 描述子几何特征详解

在 PFH(Point Feature Histogram)描述子中, α , ϕ , θ \alpha, \phi, \theta α,ϕ,θ 是用来描述点对 ( p i , p j ) (p_i, p_j) (pi,pj) 之间局部几何关系的三个核心参数。它们通过点云位置和法向量的相对关系,捕获点云局部的几何结构。


符号定义
  1. p i , p j \mathbf{p}_i, \mathbf{p}_j pi,pj:两点的位置向量。
  2. n i , n j \mathbf{n}_i, \mathbf{n}_j ni,nj:两点对应的法向量。
  3. d = p j − p i \mathbf{d} = \mathbf{p}_j - \mathbf{p}_i d=pjpi:两点之间的方向向量。

以下是三个特征的逐项解析:


1. α \alpha α:

α = arctan ⁡ ( n j ⋅ ( d × n i ) d ⋅ n i ) \alpha = \arctan \left( \frac{\mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i)}{\mathbf{d} \cdot \mathbf{n}_i} \right) α=arctan(dninj(d×ni))

  • 几何意义:
    α \alpha α 描述了法向量 n j \mathbf{n}_j nj d \mathbf{d} d 方向向量之间的扭转关系,是对三者的空间交互关系的一个度量。
  • 分子 n j ⋅ ( d × n i ) \mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i) nj(d×ni)
    • 计算 d × n i \mathbf{d} \times \mathbf{n}_i d×ni,即方向向量 d \mathbf{d} d 和法向量 n i \mathbf{n}_i ni 的叉积,得到一个垂直于 d \mathbf{d} d n i \mathbf{n}_i ni 平面的向量。
    • 点积 n j ⋅ ( d × n i ) \mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i) nj(d×ni) 计算 n j \mathbf{n}_j nj 在该平面垂直方向上的投影,从而衡量 n j \mathbf{n}_j nj 与该平面的偏离程度。
  • 分母 d ⋅ n i \mathbf{d} \cdot \mathbf{n}_i dni
    • 表示方向向量 d \mathbf{d} d 在法向量 n i \mathbf{n}_i ni 上的投影。
    • 分母用来对分子归一化,确保 α \alpha α 的取值范围符合 arctan ⁡ \arctan arctan 的定义域。
  • 关键点:
    α \alpha α 的正负与值大小反映了 n j \mathbf{n}_j nj n i \mathbf{n}_i ni d \mathbf{d} d 所定义的平面中的相对旋转角度。

2. ϕ \phi ϕ:

ϕ = arccos ⁡ ( n i ⋅ d ) \phi = \arccos (\mathbf{n}_i \cdot \mathbf{d}) ϕ=arccos(nid)

  • 几何意义:
    ϕ \phi ϕ n i \mathbf{n}_i ni d \mathbf{d} d 之间的夹角,表示法向量 n i \mathbf{n}_i ni 与方向向量 d \mathbf{d} d 的对齐程度。
  • 公式推导:
    • n i ⋅ d = ∣ n i ∣ ∣ d ∣ cos ⁡ ϕ \mathbf{n}_i \cdot \mathbf{d} = |\mathbf{n}_i| |\mathbf{d}| \cos\phi nid=ni∣∣dcosϕ,点积直接给出了夹角的余弦值。
    • 通过 arccos ⁡ \arccos arccos 得到角度 ϕ \phi ϕ
  • 取值范围:
    • ϕ ∈ [ 0 , π ] \phi \in [0, \pi] ϕ[0,π]
    • ϕ = 0 \phi = 0 ϕ=0 时, n i \mathbf{n}_i ni d \mathbf{d} d 完全平行。
    • ϕ = π / 2 \phi = \pi/2 ϕ=π/2 时, n i \mathbf{n}_i ni d \mathbf{d} d 正交。
    • ϕ = π \phi = \pi ϕ=π 时, n i \mathbf{n}_i ni d \mathbf{d} d 完全反向。

3. θ \theta θ:

θ = arccos ⁡ ( n i ⋅ n j ) \theta = \arccos (\mathbf{n}_i \cdot \mathbf{n}_j) θ=arccos(ninj)

  • 几何意义:
    θ \theta θ n i \mathbf{n}_i ni n j \mathbf{n}_j nj 之间的夹角,描述两点法向量的方向差异。
  • 公式推导:
    • n i ⋅ n j = ∣ n i ∣ ∣ n j ∣ cos ⁡ θ \mathbf{n}_i \cdot \mathbf{n}_j = |\mathbf{n}_i| |\mathbf{n}_j| \cos\theta ninj=ni∣∣njcosθ
    • 通过 arccos ⁡ \arccos arccos 计算夹角 θ \theta θ
  • 取值范围:
    • θ ∈ [ 0 , π ] \theta \in [0, \pi] θ[0,π]
    • θ = 0 \theta = 0 θ=0 时, n i \mathbf{n}_i ni n j \mathbf{n}_j nj 方向完全一致。
    • θ = π / 2 \theta = \pi/2 θ=π/2 时, n i \mathbf{n}_i ni n j \mathbf{n}_j nj 正交。
    • θ = π \theta = \pi θ=π 时, n i \mathbf{n}_i ni n j \mathbf{n}_j nj 方向完全相反。

三者的关系与直方图构建

  • 三角参数的物理意义:
    这三个参数从不同角度描述了点对 ( p i , p j ) (p_i, p_j) (pi,pj) 的几何关系:
    • α \alpha α:捕获法向量与方向向量之间的旋转信息。
    • ϕ \phi ϕ:描述法向量 n i \mathbf{n}_i ni 与方向向量 d \mathbf{d} d 的夹角。
    • θ \theta θ:衡量两个点的法向量之间的角度差异。
  • 直方图构建:
    • 对每个点对 ( p i , p j ) (p_i, p_j) (pi,pj) 计算上述三种特征。
    • 将三种特征分别量化到直方图的不同维度中,最终得到一个高维直方图。

直观解释

可以将 α , ϕ , θ \alpha, \phi, \theta α,ϕ,θ 看作是对局部几何关系的“全面体检”:

  • α \alpha α 检查法向量如何绕着方向向量旋转;
  • ϕ \phi ϕ 检查方向向量在法向量的方向上有多大的偏移;
  • θ \theta θ 检查法向量之间是否一致。

它们结合起来,完整描述了点对之间的空间几何关系。


PFH 的特性

  1. 高维度: PFH 描述子的维度较高(125 维),因为它对每个点对的几何关系都进行精确建模。这使得 PFH 能够捕获更详细的局部信息。
  2. 鲁棒性: PFH 对噪声和点云稀疏程度具有较好的鲁棒性,但其计算复杂度较高。
  3. 对点对几何关系的建模: PFH 考虑了邻域中每对点的几何关系,这使得它可以捕获更多的信息,但也导致了较高的计算复杂度。

PFH 的优缺点

优点:
  1. 丰富信息: PFH 捕获了邻域点之间的所有几何关系,信息量丰富。
  2. 高鲁棒性: 对于复杂的局部几何形状,PFH 描述子表现出色。
缺点:
  1. 高计算复杂度: 由于考虑了邻域中每对点的关系,PFH 的计算复杂度为 O ( n 2 ) O(n^2) O(n2)
  2. 高维度: PFH 的高维度可能会导致存储和匹配上的性能问题。

FPFH (Fast PFH)

由于 PFH 的计算复杂度较高,提出了一种加速版本 FPFH (Fast Point Feature Histogram)
FPFH 不再计算邻域中所有点对的几何关系,而是通过分层的方法,只计算目标点与邻域点的几何关系,再结合邻域点的 PFH 特征进行加权组合,从而降低计算复杂度到 O ( n ) O(n) O(n)


PFH 的应用场景

  1. 点云配准:
    使用 PFH 描述子匹配关键点,完成不同点云的对齐。
  2. 物体识别:
    对三维点云中的物体进行特征提取,用于物体分类和识别。
  3. 局部特征分析:
    PFH 描述子可以描述点云局部的几何特性,用于三维形状分析。

示例代码

以下是一个计算点云 PFH 描述子的简要示例:

#include <pcl/io/pcd_io.h>
#include <pcl/features/pfh.h>
#include <pcl/features/normal_3d.h>

typedef pcl::PointXYZ PointT;

int main() {
    // 读取点云
    pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
    pcl::io::loadPCDFile("cloud.pcd", *cloud);

    // 计算法向量
    pcl::NormalEstimation<PointT, pcl::Normal> ne;
    ne.setInputCloud(cloud);
    pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
    ne.setSearchMethod(tree);

    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    ne.setRadiusSearch(0.05); // 半径搜索
    ne.compute(*normals);

    // 计算 PFH 描述子
    pcl::PFHEstimation<PointT, pcl::Normal, pcl::PFHSignature125> pfh;
    pfh.setInputCloud(cloud);
    pfh.setInputNormals(normals);
    pfh.setSearchMethod(tree);
    pcl::PointCloud<pcl::PFHSignature125>::Ptr pfh_features(new pcl::PointCloud<pcl::PFHSignature125>);
    pfh.setRadiusSearch(0.1); // 设置搜索半径
    pfh.compute(*pfh_features);

    std::cout << "PFH features computed: " << pfh_features->size() << std::endl;
    return 0;
}

为什么PFH特征是旋转不变的?

PFH特征通过对局部几何形状的描述来表示每个点的特征,它不仅依赖于点的位置,还依赖于点与其邻域内其他点的几何关系,具体包括法向量和点之间的角度信息。旋转不变性来源于PFH的计算方式,它利用了点云中每个点的局部几何关系,而不依赖于点云的绝对位置和方向。

PFH特征的核心步骤包括:

  1. 法向量计算:PFH首先计算每个点的法向量,这对于描述点云的局部形状至关重要。
  2. 计算角度信息:PFH通过计算邻域内点与目标点的相对角度,考虑了法向量与其他点之间的关系。这些角度信息本质上是旋转不变的,因为它们只是描述了点之间的几何关系,而不受全局旋转的影响。

因此,即使点云在空间中被旋转,PFH特征也能保持不变。这使得PFH特征特别适用于处理在不同角度下捕获的点云数据,保证了特征的稳健性和一致性。

总结

PFH特征对旋转具有不变性,这使得它在处理3D点云数据时,尤其是在物体识别和配准任务中非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值