table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
1、使用手动对应点计算基础矩阵。对图像对运行角点检测器。使用点选式图形用户界面(GUI)手动标记大约20个分布均匀的对应点。计算基础矩阵,并为每个对应点在图像上绘制共轭对的对极线。使用八点算法,以最少八个对应点进行不同数量和组合的对应点实验。观察并评论对极线相对于所选对应点集的敏感性。
任务描述
此任务需先对图像对运行角点检测器,借助点选式GUI手动标记约20个分布均匀的对应点。
步骤说明:
角点检测与标记
– 使用角点检测器处理图像对。
– 借助点选式GUI手动标记约20个分布均匀的对应点。
基础矩阵计算
– 计算基础矩阵。
对极线绘制
– 为每个对应点在图像上绘制共轭对的对极线。
八点算法实验
– 利用八点算法,最少使用八个对应点。
– 进行不同数量和组合的对应点实验。
结果分析
– 观察并评论对极线对所选对应点集的敏感性。
2、带外点去除的基础矩阵估计。在20个正确角点对应关系中添加4个错误的角点对应关系。观察其对计算出的基础矩阵和相关(被破坏的)对极线的影响。用随机抽样一致性(RANSAC)算法增强对基础矩阵估计的实现。在图像上使用图形覆盖来显示RANSAC已正确识别出了外点,并验证现在可以在没有外点破坏影响的情况下计算基础矩阵及其相关的对极线。
该任务要求:
先在20个正确角点对应关系中加入4个错误对应,观察其对基础矩阵和对极线的影响;
然后用RANSAC算法改进基础矩阵估计;
通过图形覆盖展示RANSAC识别外点的结果;
最后验证无外点影响下基础矩阵和对极线的计算。
3、简述相机校准的操作步骤及在时间有限时的处理办法。
相机校准的操作步骤包括:
通过打印棋盘图案并将其粘贴到一块平板上,自制一个校准目标;
使用点选式图形用户界面(GUI)来半自动化校准目标与一组已捕获的校准图像之间的角点对应关系;
为立体相机对实施相机校准程序,以确定立体相机系统的内参和外参。
在时间有限时,可以选择使用网络上的一些校准库。
4、选择合适的数据结构,展示如何使用面积加权法计算三角网格的顶点法线。
下面以面积加权法为例说明计算三角网格顶点法线的过程:
假设存在一个顶点,其按逆时针顺序的入射边序列为 ⟨e₁, …, eₙ⟩,且 e₁ = eₙ。由边 eᵢ 和 eᵢ₊₁ 定义的面的面积加权法线为 eᵢ × eᵢ₊₁。那么该顶点的面积加权法线
n
Area v
计算公式为:
$$
mathbf{n}
{ ext{Area }v} = sum
{i=1}^{n-1} (mathbf{e}
i imes mathbf{e}
{i+1})
$$
需要注意的是,这个结果需要归一化为单位长度。
数据结构方面
,可以使用顶点-面列表来存储三角网格。对于每个顶点,遍历其相邻的面,计算每个面的面积加权法线并累加,最后将累加结果归一化得到该顶点的法线。
5、描述如何在半边结构中实现边收缩操作。必须从结构中移除收缩的边和其中一个顶点,必须更改与被删除顶点相关的边,使其与保留的顶点相关,最后必须移除任何退化面。
对顶点对 $(v_1, v_2)$ 进行收缩,将其转换到新位置 $ar{v}$,连接所有与 $v_1$ 相关的边,并删除顶点 $v_2$。
移除收缩后变得退化的边和面(即不再有 3 个不同顶点的面)以及重复的边。
从原始高分辨率网格 $M_N = (K_N, S)$ 开始,应用一系列的顶点对收缩,直到满足简化目标(如达到目标顶点数)。每次收缩对应于对复形 $K_N$ 和形状向量 $S$ 的局部增量修改,算法生成分辨率递减的网格序列 $M_N, M_{N – 1}, M_{N – 2}, dots$。
通常仅考虑有效边对进行收缩,即 ${i, j} in K_N$。当边 $(v_i, v_j)$ 收缩为 $ar{v}
{ij}$ 时,修改描述网格拓扑的单纯复形 $K_N$:
$$
K
{N – 1} = K_N setminus [{j}, {i, j}, {j, k}, {i, j, k} : {i, j, k} in K_N]
$$
边收缩还会修改每个单独网格的形状向量,删除顶点 $v_j$ 并将 $v_i$ 移动到 $ar{v}_{ij}$。
6、使用你选择的网格表示方法,展示如何评估顶点处的二次误差度量。
每个顶点是一组三角形(平面)的交点。可以将顶点相对于这组平面的误差定义为到每个三角形的距离平方和。
给定由方程 $ ax + by + cz + d = 0 $ 定义的三角形平面 $ p $(其中 $ mathbf{n} = [a, b, c] $ 是平面法线,$ d $ 是标量常数),基本二次型 $ Q $ 定义为:
Q=[nnT,dn,d2]=(A,b,c)Q=[nnT,dn,d2]=(A,b,c)
其中:
$ A $ 是 $ 3 imes 3 $ 矩阵,
$ mathbf{b} $ 是三维向量,
$ c $ 是标量。
二次型 $ Q $ 通过二阶方程:
Q(v)=vTAv+2bTv+cQ(v)=vTAv+2bTv+c
为空间中每个点 $ v $ 赋值。
顶点 $ v_i $ 处的二次误差 $ EQ_i(v_i) $ 由:
EQi(vi)=∑pQp(vi)=Qi(vi)EQi(vi)=∑pQp(vi)=Qi(vi)
完全确定,其中 $ Q_i = sum_p Q_p $ 是所有与顶点 $ v_i $ 相交的平面的基本二次型之和。
7、使用简单欧几里得度量匹配同一人的一对面部扫描的描述符。注意对称面部匹配时的问题。为对称物体的点匹配问题提出解决方案。
匹配对称面部时可能出现的问题
问题描述
:
基于特征的对应方法可能产生不一致的匹配,特别是在具有重复结构或对称性的形状中。例如,人体左右两侧的点可能由于双侧对称性而被交换。
解决方案
:
添加一些全局结构,例如成对测地距离或扩散距离保留约束。这种最小失真对应尝试同时匹配局部结构(描述符)和全局结构(度量),可以通过以下方法实现:
广义多维缩放(GMDS)算法的扩展
图标记方法
8、实现一种基于主成分分析(PCA)的成对预对齐技术。尝试通过改变两个视图的形状来检验预对齐的有效性。
以下是实现基于PCA的成对预对齐技术并检验其有效性的步骤:
数据准备
:
获取两个三维形状的点云数据,分别记为点云A和点云B。
基于PCA的预对齐实现
:
– 计算点云A和点云B的质心,将两个点云的质心平移到坐标系原点,实现主要的平移对齐。
– 对平移后的点云A和点云B分别进行PCA分析,计算它们的主坐标轴。
– 通过旋转操作,使得点云A和点云B的主坐标轴尽可能对齐。
改变形状并检验预对齐有效性
:
– 对原始的点云A和点云B进行形状变换,例如缩放、旋转、添加噪声、改变重叠部分等,生成不同形状的点云对。
– 对每一对改变形状后的点云重复步骤2中的预对齐操作。
– 可以使用以下指标来检验预对齐的有效性:
对齐误差
:计算预对齐后两个点云之间的平均距离或均方误差。
重叠率
:评估预对齐后两个点云的重叠部分占总体的比例。
可视化
:直观观察预对齐后的点云是否更接近。
结果分析
:
根据不同形状下的检验指标,分析预对齐技术的有效性。例如,如果在不同的缩放比例、旋转角度或噪声水平下,对齐误差都能保持在较低水平,且重叠率较高,则说明该预对齐技术具有较好的有效性和鲁棒性。
9、通过用单位四元数编码旋转来计算LM – ICP的雅可比矩阵。
雅可比矩阵定义为
Ji,j=(∇xDε(T(a,di))⋅∇ajT(a,di))Ji,j=(∇xDε(T(a,di))⋅∇ajT(a,di))
其中
∇ajT(a,di)=[∂Tx(a,di)∂aj,∂Ty(a,di)∂aj,∂Tz(a,di)∂aj]∇ajT(a,di)=[∂Tx(a,di)∂aj,∂Ty(a,di)∂aj,∂Tz(a,di)∂aj]
用单位四元数对旋转进行建模,其导数可以很容易地解析计算。
10、实现一个基于主成分分析(PCA)的3D人脸识别系统,仅使用原始深度数据,并将结果与基于迭代最近点(ICP)的系统进行比较。
基于PCA的3D人脸识别系统实现
要实现基于PCA的3D人脸识别系统,需先将姿态归一化的3D扫描数据划分为训练集和测试集。训练步骤如下:
对于n个训练图像集xi(i = 1…n),每个训练人脸在深度图或表面特征空间中表示为m维点(列向量)x = [x1,…,xm]T,将n个训练人脸向量按行堆叠构建n×m的训练数据矩阵X。
执行均值中心化操作,从矩阵X的每一行减去训练人脸向量的均值¯x,形成零均值训练数据矩阵X0。
要比较PCA系统与ICP系统的结果,可使用FRGC v2 3D人脸数据集进行实验。先构建或下载工具加载和显示FRGC数据集中ABS格式文件存储的3D人脸扫描数据,对数据进行裁剪、去除尖峰和填充孔洞等预处理。
然后分别实现基于ICP的人脸验证系统和基于PCA的3D人脸识别系统,使用预处理后的扫描数据作为输入,比较二者的识别性能。
还可使用面部遮罩仅包含3D人脸扫描的上半部分用于训练和测试数据,重新运行ICP和PCA实验并与之前结果对比,尤其是针对具有非中性面部表情的扫描数据。
11、自动特征对应。根据平方差之和(SSD)度量实现一个自动匹配两幅图像中角点的函数。同时,实现一个归一化互相关(NCC)度量的函数。比较在亮度相似和亮度不同的测试图像上的匹配结果。
图像匹配方法对比
一般而言,实现SSD函数需遍历图像窗口,计算对应像素强度差的平方和;实现NCC函数需先对图像窗口像素值归一化,再按公式计算。比较不同亮度图像匹配结果时,SSD在亮度不同时可能效果不佳,NCC因归一化处理可能更具鲁棒性。
伪代码示例
SSD函数
import numpy as np
def ssd(Il, Ir, d):
h, w = Il.shape
ssd_values = np.zeros((h, w))
for y in range(h):
for x in range(w):
if x - d >= 0:
ssd_values[y, x] = np.sum((Il[y, x] - Ir[y, x - d])**2)
return ssd_values
NCC函数
import numpy as np
def ncc(Il, Ir, d):
h, w = Il.shape
ncc_values = np.zeros((h, w))
for y in range(h):
for x in range(w):
if x - d >= 0:
Il_window = Il[y, x]
Ir_window = Ir[y, x - d]
Il_mean = np.mean(Il_window)
Ir_mean = np.mean(Ir_window)
numerator = np.sum((Il_window - Il_mean) * (Ir_window - Ir_mean))
denominator = np.sqrt(np.sum((Il_window - Il_mean)**2) * np.sum((Ir_window - Ir_mean)**2))
if denominator != 0:
ncc_values[y, x] = numerator / denominator
return ncc_values
要比较不同亮度图像的匹配结果,可使用上述函数分别处理亮度相似和不同的图像对,然后观察匹配结果的准确性和稳定性。
12、基于自动对应关系的基础矩阵。将基础矩阵计算方法(结合随机抽样一致性算法)应用于自动特征对应关系。确定对极点的位置,并再次绘制对极线。
可按以下步骤操作:
首先进行基础矩阵计算,结合随机抽样一致性算法(RANSAC)去除异常值;
然后通过求基础矩阵的左右零空间来确定对极点位置;
最后通过基础矩阵与对应点计算来绘制对极线。
13、图像校正。计算要应用于立体图像对中每个图像的图像变形(单应性变换),使得共轭极线是水平的(平行于x轴)且具有相同的y坐标。绘制一组极线以检查此校正是否正确。
图像校正方法
有两种图像校正的方法:
1. 有校准信息的校正
假设是校准的立体设备,已知相机的内参和外参。找到一个图像映射,从原始图像生成一对如同从直线立体设备获得的图像。
需要根据校准信息确定左右视图校正的旋转矩阵。
通过单应性变换对左右图像点进行变换。
若左右相机焦距不同:
需按焦距比例缩放图像。
并进行重采样和插值。
2. 无校准信息的校正
使用从原始图像数据中的对应关系计算出的基础矩阵估计来实现校正。
常见方法是为左右图像计算一对校正单应性矩阵,使校正后图像的基础矩阵与标准直线立体设备的形式相同。
但当极点位于图像内时,该方法可能失效。
可通过沿极线直接对原始图像进行重采样来解决。
14、实现一个函数,使用归一化互相关(NCC)作为相似度度量,对左右校正后的图像进行局部密集立体匹配,从而为立体图像对生成视差图。拍摄一系列具有不同纹理量且与相机距离不同的场景的立体图像,并比较它们的视差图。
以下是实现该任务的大致步骤:
实现局部密集立体匹配函数:
– 输入左右校正后的图像。
– 使用NCC作为相似度度量,对每个像素进行匹配计算。
– 生成视差图。
拍摄立体图像:
– 选择具有不同纹理量的场景。
– 改变场景与相机的距离。
– 拍摄立体图像对。
比较视差图:
– 对拍摄的不同场景的立体图像对生成视差图。
– 分析和比较不同视差图的特征,如视差范围、视差分布等。
要实现具体的代码,可使用Python和OpenCV库,以下是一个简单的示例框架:
import cv2
import numpy as np
def local_dense_stereo_matching(left_image, right_image, window_size=5, max_disparity=64):
height, width = left_image.shape
disparity_map = np.zeros((height, width), dtype=np.uint8)
for y in range(window_size//2, height - window_size//2):
for x in range(window_size//2, width - window_size//2):
best_ncc = -1
best_disparity = 0
for d in range(max_disparity):
if x - d >= window_size//2:
left_window = left_image[y - window_size//2:y + window_size//2 + 1, x - window_size//2:x + window_size//2 + 1]
right_window = right_image[y - window_size//2:y + window_size//2 + 1, x - d - window_size//2:x - d + window_size//2 + 1]
ncc = np.corrcoef(left_window.flatten(), right_window.flatten())[0, 1]
if ncc > best_ncc:
best_ncc = ncc
best_disparity = d
disparity_map[y, x] = best_disparity
return disparity_map
# 读取左右图像
left_image = cv2.imread('left_image.jpg', 0)
right_image = cv2.imread('right_image.jpg', 0)
# 进行局部密集立体匹配
disparity_map = local_dense_stereo_matching(left_image, right_image)
# 显示视差图
cv2.imshow('Disparity Map', disparity_map)
cv2.waitKey(0)
cv2.destroyAllWindows()
此代码仅为示例,实际应用中可能需要根据具体需求进行调整和优化。
15、实现一个函数,根据视差图和相机校准信息进行3D重建。使用图形工具可视化重建结果。对不同场景和与立体相机不同距离下的重建性能进行评价。
3D重建实现与性能评价
可按以下步骤实现3D重建并评价性能:
1. 实现3D重建函数
利用以下公式根据视差图和相机校准信息(焦距 $ f $、基线距离 $ B $ 等)计算3D世界点坐标:
深度计算:$ Z = frac{fB}{d} $
世界坐标计算:
$ X = frac{Zx’_c}{f} $
$ Y = frac{Zy’_c}{f} $
将视差图转换为深度图,以生成3D点云。
2. 可视化重建结果
使用图形工具(如 OpenGL 等)将生成的3D点云进行可视化展示。
3. 评价重建性能
不同场景
不同场景的复杂度和特征分布不同:
复杂场景
(如纹理丰富、存在大量遮挡的场景)可能导致视差计算不准确,影响重建效果;
简单场景
(如纹理单一、无遮挡的场景)重建效果相对较好。
不同距离
根据公式 $ sigma_Z = frac{Z^2}{Bf} sigma_d $,深度不确定性随深度呈二次方增加:
物体距离立体相机较远时,深度估计更不确定,重建精度下降;
距离较近时,重建精度相对较高。
性能权衡
增加基线、焦距或图像分辨率可减少深度误差;
但会带来匹配困难、景深减小、处理时间和数据带宽需求增加等问题;
因此设计立体相机时需根据应用需求进行性能权衡。
16、使用你选择的编程环境,开发一个相移条纹投影扫描仪的二维模拟器,该模拟器能够重现强度伪影。假设光学引起的模糊仅存在于相机图像中,并且相机具有无限的空间分辨率。对使用格雷码的条纹投影系统重复该实验。
需根据相关编程知识和条纹投影扫描原理进行开发和实验。
17、修改之前开发的原型,使其适用于条纹扫描仪。绘制一张图表,展示由于条纹宽度导致的误差变化情况。
在合适的编程环境中,对之前开发的原型进行修改以适配条纹扫描仪,然后通过实验获取不同条纹宽度下的误差数据,最后用绘图工具绘制误差随条纹宽度变化的图表。
18、从以顶点 – 面列表形式存储的三角网格中提取边列表,推导出一个算法,该算法的复杂度应与三角形的数量呈线性关系。
可通过以下思路推导算法:
遍历顶点 – 面列表中的每个三角形。
对于每个三角形的三条边,检查该边是否已在边列表中:
– 若不在,则添加到边列表。
复杂度分析:
由于每个三角形有三条边,且只需遍历一次所有三角形,因此时间复杂度与三角形数量呈线性关系。
19、请提供代码来遍历与顶点相关的面
以下是可能的代码实现:
face *face = vert->outgoingedge->incidentfacet;
face *startFace = face;
do {
// 处理面
face = face->borderedge->opposite->incidentfacet;
} while (face != startFace);
以上代码仅供参考,实际应用中可能需要根据具体情况调整。
20、可以使用以下规则将球体表示为细分曲面。基础网格是一个多面体,在这种情况下使用二十面体。细分规则是通过在每条边的中点添加顶点,将每个三角形划分为四个更小的三角形。新顶点会被平移,使其到球心的距离等于球的半径。推导出一个规则,用于计算表示中的边数、面数和顶点数,该规则是迭代细分次数的函数。现在,使用你选择的三角形网格数据结构,推导出一个类似的规则,用于计算每次迭代级别存储表示所需的指针数量。
通常推导边数、面数和顶点数与迭代细分次数的函数关系,可从初始状态(二十面体的边、面、顶点数量已知),分析每次细分后这些数量的变化规律;
对于指针数量,需结合具体三角形网格数据结构(如顶点 – 面列表等),分析每次细分后各元素存储所需指针的变化规律来推导相应规则。
21、一个网格可以被视为一个加权图,其中边的权重对应于端点之间的欧几里得距离。描述如何实现迪杰斯特拉最短路径算法,以便在以半边结构存储的网格图上实现快速范围搜索。给定一个用于范围搜索的距离阈值,该算法的停止标准是什么?
通常实现迪杰斯特拉最短路径算法步骤为:
初始化距离数组,将起始顶点的距离设为
0
,其他设为无穷;
维护一个优先队列(最小堆),将起始顶点加入队列;
从队列中取出距离最小的顶点,对其相邻顶点进行松弛操作;
重复上述步骤直到队列为空。
当使用距离阈值进行范围搜索时,停止标准通常是队列中距离最小的顶点的距离大于给定的距离阈值。
22、计算一组点的描述符,在每个点上使用坐标x、y、z作为描述符。在哪些情况下,使用x、y、z作为描述符是好的或坏的选择?
当形状在空间中的位置和姿态具有重要意义,且形状的坐标能唯一区分不同形状时,
x,y,z
是好的描述符选择;
当形状会发生平移、旋转、缩放等变换,或者不同形状存在相同坐标情况时,
x,y,z
是差的描述符选择。
23、在多个形状上计算密集的热核特征签名(HKS)描述符(例如使用SHREC数据集)。通过在HKS描述符空间中进行聚类创建一个几何词汇表。通过对几何词汇表中的描述符进行向量量化来计算特征包。比较硬量化和软量化的不同设置。
可使用SHREC数据集计算HKS描述符,创建几何词汇表可通过聚类HKS描述符空间实现。对于特征包计算,经典的特征包方法是硬量化,即把1放在最接近簇对应的区间,其余区间为0;软量化则计算顶点x的特征分布θ(x),
θi(x) = c(x)exp(-∥p(x) - mi∥² / (2σ²)),
其中c(x)使∥θ(x)∥₂ = 1,p(x)是x的热核特征签名,mi是簇Ci的质心,σ为常数。实验表明软量化更有效。
24、使用计算得到的特征包,对经历变形的形状数据集进行形状检索。通过实验观察描述符的不变性和敏感性。
需按照以下步骤完成:
先计算特征包;
然后用特征包在经历变形的形状数据集上开展形状检索;
最后通过实验观察描述符在不同变形情况下的不变性和敏感性。
25、修改 LM – ICP 算法以处理多视图问题,给定围绕一个物体的 10 个视图序列,使得视图 N10 与视图 N1 高度重叠。全局参考系固定在第一个视图上。通过包含相邻视图之间的成对配准以及视图 N10 到视图 N1 的配准来估计全局配准。提示:未知数的数量为 9p,其中 p 是变换向量的维度(即,对于四元数 p = 7)。雅可比矩阵的行数由每个成对配准的所有残差向量给出。这里的关键是视图 N10 应同时与视图 N9 和视图 N1 进行成对对齐。
修改 LM-ICP 算法以处理多视图情况的步骤
要修改 LM-ICP 算法以处理多视图情况,特别是像本题中具有特定视图重叠和配准要求的情形,可按以下通用步骤进行:
初始化
:在全局参考系(固定在第一个视图)下初始化所有视图的变换参数。
构建目标函数
:考虑所有相邻视图对(N1 – N2, N2 – N3, …, N9 – N10)以及 N10 – N1 的配准,构建一个包含所有这些配准误差的目标函数。
计算雅可比矩阵
:根据提示,计算雅可比矩阵,其行数由每个成对配准的所有残差向量给出。
迭代优化
:使用 Levenberg-Marquardt 方法迭代更新变换参数,以最小化目标函数。在每次迭代中,确保视图 N10 同时与视图 N9 和视图 N1 进行成对对齐。
收敛判断
:设置收敛条件,当目标函数的变化小于某个阈值时,停止迭代。
26、在显著光谱几何特征的兴趣点检测中,原方法将特征向量的数量设置为100。现在要求使用更多数量的特征向量来实现兴趣点检测方法,并研究特征向量的数量、检测到的兴趣点数量以及它们的尺度大小之间的关系。
需按相关方法编程实现特征点检测并分析三者关系。可按以下步骤:
先在兴趣点检测方法里增加特征向量数量,
再用新参数运行方法得到兴趣点,
最后统计兴趣点数量并分析其尺度大小与特征向量数量的关联。
27、证明拉普拉斯 – 贝尔特拉米算子在尺度变化下不是不变的。此外,假设有一个均匀网格,其边的长度都相同,用 a 表示。推测当 a 趋于零时,该算子会发生什么。
拉普拉斯 – 贝尔特拉米算子的尺度不变性分析
证明拉普拉斯 – 贝尔特拉米算子在尺度变化下不具有不变性,可考虑其在欧氏平面的表达式:
当进行尺度变换时,如将坐标 $ x $ 变为 $ kx $,$ y $ 变为 $ ky $($ k $ 为尺度因子),代入表达式会发现算子值改变,从而证明其不具有尺度不变性。
此外,对于均匀网格,当边长 $ a $ 趋于零时,离散的拉普拉斯 – 贝尔特拉米算子会趋近于连续情况下的拉普拉斯 – 贝尔特拉米算子。
28、解释为什么在形状谷歌技术中,Kt(x,y) 这个量是空间因子的一个好选择?
Kt(x,y) 作为空间因子是好选择,可能是因为它能反映点 x 和 y 之间的空间关系,对于相近的点 x 和 y 会有较高的值,可在形状匹配过程中有效利用空间信息,弥补经典词袋方法量化时丢失空间信息的不足,帮助更好地进行形状匹配。
29、自旋图像中法线的方向在图像中间定义了一条水平线。该法线的微小变化会修改图像,使图像第一列中心点周围的像素发生旋转。请提出一种方法来处理法线的微小变化。
可考虑使用旋转不变特征描述符,或对图像进行旋转归一化处理等通用方法。