3D视觉算法岗笔试核心考点解析:从相机模型到点云配准

发布时间:2026/8/30 5:42:49
3D视觉算法岗笔试核心考点解析:从相机模型到点云配准 去年技术圈有个有意思的现象很多学计算机视觉的同学拿着简历投实习结果在笔试环节就被刷下来了尤其是3D视觉方向。网易2018年实习生招聘的计算机视觉算法实习生笔试题里3D视觉方向的两道题我到现在还记得。倒不是说题有多难而是它恰好卡在了一个很尴尬的位置——学校课程里教得少、项目里又容易忽略、但实际工作中却天天要用到的“几何 算法”结合部。这篇文章我想顺着这套笔试内容把3D视觉实习生岗位背后的技术栈要求、考点逻辑、以及备考思路完整拆一遍。不管你是准备校招还是想转行做3D视觉都可以把这篇文章当成一份复习地图来用。我会尽量讲清楚“为什么考这个”“应该怎么答”“背后牵扯到哪些知识体系”而不是简单贴一道题的答案。1. 3D视觉实习岗笔试到底在筛什么人1.1 岗位定位决定出题思路网易当时招的是计算机视觉算法实习生方向是3D视觉。这个方向通常对应的是三维重建、SLAM、点云处理、姿态估计这类工作跟纯2D图像分类、检测的岗位有明显区别。区别在哪3D视觉更依赖几何推理、空间变换、多视图几何这些数学基础而不是单纯堆模型、调参。所以笔试题目会刻意往“空间几何 经典算法 数学推导”这几个方向倾斜。不是说你不会深度学习就过不了而是说你如果连基础坐标系变换都搞不清楚后面做重建、做配准根本没法下手。1.2 笔试的筛选逻辑先看基础再看潜力面试官心里很清楚实习生嘛项目经验可以进来再积累但基础功底必须在笔试阶段就过关。这里的基础包括三块数学基础线性代数矩阵变换、特征值分解、SVD、概率统计高斯分布、极大似然估计、数值优化基础。多视图几何相机模型、对极几何、三角化、PnP、BABundle Adjustment的基本概念。编程功底C或Python至少一门能流畅写算法题尤其要会用STL或者NumPy做矩阵运算。这套筛选逻辑放到今天的3D视觉岗位面试里依然成立甚至要求更高了。所以如果你现在还在准备阶段别急着刷一堆深度学习模型先把这几块硬骨头啃下来。2. 3D视觉笔试核心知识体系逐项拆解2.1 相机模型与坐标系变换一切空间推理的起点3D视觉笔试几乎必考相机模型。哪怕不直接出“推导投影矩阵”这种题也会在某个场景题里隐含坐标变换的考察点。我建议把下面这条链路吃透世界坐标系 - 相机坐标系 - 图像坐标系 - 像素坐标系每一步对应一个矩阵变换合在一起就是大名鼎鼎的投影方程[ Z_c \cdot \begin{bmatrix} u \ v \ 1 \end{bmatrix} K \cdot [R | t] \cdot \begin{bmatrix} X_w \ Y_w \ Z_w \ 1 \end{bmatrix} ]其中K是内参矩阵包含fx、fy焦距与像素尺寸的比值、cx、cy主点坐标。R和t是外参也就是相机在世界坐标系中的姿态和位置。笔试里常见考法有两种一种是给你内参外参让你算某个3D点投影到图像上的像素坐标另一种反向给你一对匹配点让你算极线约束或者恢复基础矩阵F和本质矩阵E。这里有个特别容易混的点我必须单独拎出来说基础矩阵F和本质矩阵E的关系。二者相差一个内参矩阵的归一化操作[ E K^T \cdot F \cdot K ]E只包含旋转和平移信息定义在归一化平面上F包含了内参作用于像素坐标系。很多同学公式背得熟但做题时会把坐标代错这题就废了。复习时一定要多动手推几遍把归一化平面这个概念理解透。2.2 特征点与匹配三维重建的上游依赖3D视觉笔试里关于特征点的题通常不会直接让你默写SIFT的细节但会考察你对“特征点需要具备哪些性质”的理解——尺度不变、旋转不变、光照鲁棒性以及为什么需要这些性质。这背后对应的是特征点要能在不同视角下稳定被找到才能做可靠匹配。ORBOriented FAST and Rotated BRIEF在笔试中碰到的概率也很大因为它是工程上常用的折中方案。笔试可能会考ORB的BRIEF描述子为什么旋转后会失效以及加旋转校正的思路。本质上是在考察你对“描述子需要具备旋转不变性”这个需求的理解深度。还有个高频考点是RANSAC在匹配中的应用。给你一堆匹配点里面有大量错误匹配外点如何估计出一个稳如老狗的基础矩阵或者单应矩阵标准套路就是RANSAC迭代随机挑一组最小样本集比如求解单应矩阵需要4对点求解基础矩阵用8对点或者5对点。计算模型。用剩余点验证统计内点数量。重复多次保留内点最多的模型。笔试如果出这题不要只答“随机采样然后迭代”你要把外点比例的鲁棒性评估讲出来。RANSAC有个很强的性质只要外点比例不是特别离谱理论上采样次数足够多总能找到正确模型。采样次数N与内点概率w的关系为[ N \approx \frac{\log(1-p)}{\log(1-w^m)} ]其中p是期望成功率m是最小样本数。能把这个公式写出来面试官就知道你是真懂RANSAC而不是只会调函数。2.3 点云配准与ICP经典算法必须手推3D视觉方向的核心工作之一就是点云配准而ICPIterative Closest Point是绕不开的经典算法。笔试中基本不会要求徒手实现完整ICP但一定会考你以下几个点ICP的迭代步骤找最近点匹配、计算旋转平移、更新变换、重复直到收敛。目标函数形式[ \min_{R,t} \sum_{i} | R p_i t - q_i |^2 ]求解方法SVD解法先算质心去中心化然后计算协方差矩阵再SVD分解得到R和t。缺点对初值敏感容易陷入局部最优。我见过最狠的考法是直接给你两堆3D点坐标让你用SVD解出最优旋转矩阵。这种题实际上考的是线性代数功底——夸克矩阵、SVD分解、旋转矩阵的正交约束。复习时一定要自己手推一遍流程计算两组点的质心[ p_c \frac{1}{n}\sum p_i, \quad q_c \frac{1}{n}\sum q_i ]去中心化[ x_i p_i - p_c, \quad y_i q_i - q_c ]构造协方差矩阵[ W \sum x_i y_i^T ]对W做SVD分解[ W U \Sigma V^T ]解得旋转矩阵[ R V U^T ]检查det(R) 1必要时符号修正。平移量[ t q_c - R p_c ]这套流程不仅要会推还得能写代码。笔试如果让你口述思路你也要把每一步的动机说清楚比如为什么用SVD——因为SVD能在保持正交约束的前提下找到使目标函数最小化的旋转矩阵。2.4 深度估计与立体匹配从原理到应用3D视觉里深度估计是个大方向。笔试中可能出现的题型包括双目立体匹配的基本流程、视差与深度的关系、单目深度估计的难点。双目视觉里最核心的公式是[ Z \frac{f \cdot b}{d} ]其中Z是深度f是焦距b是基线距离d是视差。笔试如果要变形考可能会给你相机的分辨率和基线长度让你算某个视差值对应的深度范围。这题本身不难但你得知道视差与深度是反比关系——近处物体视差大远处物体视差小。立体匹配的经典流程也要能讲清楚代价计算 - 代价聚合 - 视差计算 - 视差优化。其中代价聚合是很多算法的核心差异所在比如SGMSemi-Global Matching就靠路径聚合来约束视差平滑性。笔试考到这个层次基本就是在看你对经典3D视觉算法有没有系统性认知而不只是会用现成库。单目深度估计是另一个方向更偏深度学习。如果笔试穿插问“单目深度估计为什么是病态问题”你需要知道单个视角丢失了尺度信息同一个2D图像可能对应无数种3D解释。深度学习能做的是从数据中学习先验来“猜”一个合理的深度值。这种开放题很考察工程直觉能展开说的角度很多比如损失函数怎么设计、深度范围怎么归一化、训练数据怎么获取。2.5 SLAM与多视图几何加分项但越来越常考如果你投的岗位明确写“SLAM方向”或者“三维重建方向”那SLAM不会缺席。不过2018年那会儿实习生笔试直接考大而全的SLAM系统细节不太现实更多是从多视图几何入手。考法通常有两种。一种是给一个场景让你设计一个稀疏重建流程。另一种是给出几幅图像对应关系让你谈如何恢复相机位姿和场景结构。这里需要掌握的核心链条是特征提取 - 特征匹配 - 相对位姿估计基础矩阵、单应矩阵或本质矩阵 - 三角化 - PnP - BA优化RANSAC在每一步都能发挥作用比如在匹配阶段剔除错误匹配、在PnP求解时抵抗外点。笔试回答这类题时把“外点占比高时怎么办”这个点答好会比其他候选人多拿不少分。因为很多候选人的答案就是标准流程平铺完全没有鲁棒性意识。BA优化是很多3D视觉面试的进阶题。问法通常是“为什么需要BA它优化的是什么”要回答清楚BA同时优化相机位姿和3D点位置最小化重投影误差。用舒尔补Schur complement技巧可以加速求解这也是工程实现里的关键点。3. 典型题目复盘与解题思路示范3.1 典型的坐标投影计算题在3D视觉笔试中“已知某3D点坐标求它在图像上的像素坐标”这道题出现的频率非常高。可以把它看成是3D视觉版的“Hello World”——简单但能过滤掉不理解坐标系的人。题目通常会这样设计相机内参K给定外参R、t给定某空间点的世界坐标为[P_w (X_w, Y_w, Z_w)^T]求该点在图像中的像素坐标[(u, v)]。解题主流程分三步把世界坐标变换到相机坐标[ P_c R \cdot P_w t ]把相机坐标投影到归一化平面[ x X_c / Z_c, \quad y Y_c / Z_c ]通过内参得到像素坐标[ u f_x \cdot x c_x, \quad v f_y \cdot y c_y ]丢分重灾区有两个第一外参变换R和t的方向搞反第二忘记归一化用[X_c]直接乘内参而不是除以[Z_c]。复习时建议把“相机坐标是三维点像素坐标是二维点中间必须经过归一化平面”这句话刻在脑子里反复默念。3.2 涉及RANSAC和基础矩阵的题目另一道比较经典且综合性强的题是给你一组匹配点对让你估计两幅图像之间的基础矩阵F同时处理错误匹配。这题要拿高分回答应该分两层。第一层是常规思路用八点法计算F矩阵然后再用极线约束验证匹配残差。第二层是鲁棒性处理使用RANSAC不断采样八对点计算F并用剩余匹配点统计外点比例选内点数最多的F作为最终估计。优秀答案往往还会补充一句实际使用中特征点的坐标要先做归一化否则八点法数值不稳定。这一点能直接体现工程经验。如果再往前一步你可以提一对“基础矩阵退化为单应矩阵”的条件——当场景近似为一个平面或者相机只有旋转运动时此时用单应矩阵H描述两帧关系更合适。这会让你的答案更有层次感。3.3 ICP与SVD求解的编程题如果笔试出了手写代码题对于3D视觉岗位最常见的“编程题”就是ICP中的一个核心步骤——给定两组已匹配的三维点用SVD求旋转和平移。思路表达出来不算难但要注意处理几个边角细节数据点是行向量还是列向量矩阵维度要匹配。去中心化后要验证两组点的质心是否一致防止算出错误的平移量。SVD分解后[R V U^T]不一定是旋转矩阵要检查|R|行列式如果为-1则取负号修正。C实现核心代码大概长这样// 计算质心 Point3D pc(0, 0, 0), qc(0, 0, 0); for (int i 0; i N; i) { pc p[i]; qc q[i]; } pc / N; qc / N; // 去中心化构造协方差矩阵 Eigen::Matrix3d W Eigen::Matrix3d::Zero(); for (int i 0; i N; i) { Vector3d x p[i] - pc; Vector3d y q[i] - qc; W x * y.transpose(); } // SVD分解 Eigen::JacobiSVDEigen::Matrix3d svd(W, Eigen::ComputeFullU | Eigen::ComputeFullV); Eigen::Matrix3d R svd.matrixV() * svd.matrixU().transpose(); // 保证旋转矩阵行列式为1 if (R.determinant() 0) { Eigen::Matrix3d U svd.matrixU(); U.col(2) * -1; R svd.matrixV() * U.transpose(); } Vector3d t qc - R * pc;这里用到了Eigen库的SVD分解。如果笔试环境不允许用Eigen你需要能口述SVD的物理含义以及如何通过它恢复旋转矩阵。3.4 开放设计与估算类题目除了纯技术推导题3D视觉笔试的压轴题很多是“设计题”。比如说给你一个RGB-D相机让你设计一套桌面物体三维重建流程。这类题看起来没有固定答案但考核点非常明确是否知道RGB-D数据的融合方法TSDF、八叉树等。是否了解位姿估计的参考方案ICP、特征匹配、或者二者的结合。是否考虑过传感器噪声、深度缺失对重建质量的影响。是否有后处理环节比如滤波、网格化、纹理映射。我建议回答这类题时采用“分层递进”的结构先说整体流程再讲每一层的关键算法最后提及工程上的坑。比如先做深度图预处理——用双边滤波或者空间时域联合滤波去除边缘噪声再做帧间配准——用RGB图的特征匹配提供初值用ICP精对齐再融合到TSDF体素场中最后用Marching Cubes生成三角网格并映射颜色信息。这种回答方式既体现了知识面又展示了工程思维拿分能力远超只说“用KinectFusion”一句话的选手。4. 备考路线与实操建议4.1 时间分配经典几何占大头深度学习为辅3D视觉笔试题目的特点是范围明确但深度参差。如果你想稳过我的建议是把复习时间按照“6:3:1”分配60%多视图几何、相机模型、特征点、点云配准这些经典内容。它们考察频率最高而且知识点边界清晰适合短期突击。30%编程与算法题。包括C基础、Eigen矩阵库的使用、LeetCode里中等难度的数组/链表题目。3D视觉岗位笔试越来越看重代码基本功有的公司直接加一轮“现场手写SVD或ICP”的编程面。10%深度学习在3D视觉中的应用比如PointNet系列、MVSNet、单目深度估计的损失函数设计。这部分主要应对开放题或面试官的追问不需要背太多论文但要知道主流思路。4.2 必读书单与资料推荐关于多视图几何最经典的当然是多视图几何书但“经典”也意味着厚和难啃。我建议挑重点章节读不要从头到尾硬啃相机几何、双目立体几何、单应矩阵与基础矩阵、三角化、PnP、BA。每一章配合习题做效率会高很多。具体练习建议把某一章的核心证明推一遍比如“本质矩阵的奇异值是(1,1,0)”这个性质的推导能帮你把对极几何的很多概念串起来。推完你会发现F矩阵的秩为2、E矩阵的奇异值约束、以及最小解个数这些考点背后都是同一个数学结构。SLAM方面可以补充读《视觉SLAM十四讲》。这本书对新手极度友好里面有大量直观的几何解释和代码示例非常适合快速建立3D视觉的全局认知。特别是它把各章与地图分为“前端里程计、后端优化、回环检测、建图”四块的划分方式即使笔试不直接考也会让你在面对“三维重建流程设计”这类题时思路清晰很多。深度学习3D视觉方向可以看一些综述性论文比如《Deep Learning for 3D Point Clouds: A Survey》。不用精读但你至少要知道PointNet、PointNet、VoxelNet这些名字分别解决什么问题以及为什么后来的方法能比之前的方法效果好。4.3 动手项目怎么选笔试是基础考察项目则是你能不能脱颖而出的关键。对3D视觉来说我推荐下面几个方向的项目好上手又契合笔试题考察范围从零实现一个双目立体匹配流程拍几组照片用SGBM或自写代价聚合算法生成视差图再把视差图转成点云。这个项目能把特征匹配、标定、三维坐标计算全串起来。室内小场景的稀疏重建用手机绕着物体拍一圈用OpenMVG或COLMAP做SfM重建稀疏点云并导出相机位姿。做完这个项目你对特征点、位姿估计、三角化的理解会上一大台阶。用RGB-D相机做桌面物体的6D姿态估计训练一个简单的姿态回归网络或者用ICP做模板配准。这类项目同时接触到深度图像处理和几何优化面试时非常加分。以上项目不用做得多大关键是做完之后你要能回答出三个问题每一环节的输入输出是什么失败时最可能出在哪一步有哪些方案可以改进能回答清这三个问题面试官就会觉得你具备独立的工程问题解决能力而不只是调参侠。4.4 手撕代码的常见题型3D视觉实习笔试的代码环节有两种常见出题模式。一种是“算法题”比如让你实现一个KMP的next数组计算或者写一个快速排序。这类题出现的逻辑往往是为了查你的基础数据结构功底跟岗位方向关系不大。另一种是“3D视觉工具题”比如让你参考OpenCV或PCL的API写一段RANSAC去外点代码或者写一个给定相机内外参的正投影函数。这类题更贴近真实工作场景面试官往往不在乎代码能不能一次编译通过而在乎你的代码是否结构清晰、变量名是否可读、有没有考虑边界情况。我的建议是备考阶段两种题型的代码都要手写不要只刷LeetCode也不要只看教程。3D视觉类的工具题尤其要多练因为很多人看书觉得全会一写代码就在坐标归一化和矩阵维度上卡壳。5. 常见问题与避坑实录5.1 重视论文而忽视数学推导这个问题太常见了。很多同学一上来就看最新的3D深度学习的论文什么网络结构、loss函数都能侃侃而谈但被问到基础矩阵的秩为什么是2时瞬间卡壳。笔试出题人深谙这个现象所以往往在基础问题上加重考察权重。正确路径是先吃透经典基础再沿着经典算法的发展脉络看论文。比如先搞懂SIFT怎么做到尺度不变再去看SuperPoint这类基于学习的方法解决了SIFT的什么痛点。这样你的知识体系是有脉络的而不是碎片化堆砌。5.2 手推公式太慢解题没时间笔试有时间限制很多同学不是不会推而是推得太慢导致后面的题目没时间做。我的经验是考前每个核心公式都要给自己限定时间推三遍以上。第一遍看笔记推第二遍脱稿推第三遍在限时状态推。考试时大部分公式要形成肌肉记忆看到题目就能条件反射地写出来。比如从投影方程到归一化平面要能流畅写出来从目标函数到SVD求解要能边写边解释从极线约束到八点法要能指出DLA与DLT的差异。练到这种程度考场上就不会慌。5.3 只会Python不会C3D视觉岗位的很多代码库包括OpenCV、PCL、COLMAP、ORB-SLAM核心代码都是C写的。笔试虽然不一定强制要求C但如果只会Python有些涉及内存管理、指针操作的题目根本无法回答。建议至少掌握C的基础语法、STL的vector/map使用以及CMake工程的组织方式。不需要你写出多优雅的模板元编程但至少要能处理裸指针和std::shared_ptr能看懂头文件和源文件分离的工程结构。这一点是你能独立跑通开源3D视觉项目的前提。5.4 项目没有复盘细节经不起追问这是面试中杀伤力最大的一个坑。简历上写了“用COLMAP做过三维重建”面试官问“你的点云为什么那么多离群点”你如果回答“不知道可能是参数没调好”那基本就凉了。项目复盘要深入到每一段代码和每一个参数。你知道体素滤波的叶子大小为什么选0.01而不是0.1吗你知道为什么用统计滤波而不是半径滤波你知道BA之后重投影误差降到多少算合格这些问题在一开始做项目时可能没想过但面试前一定要补上。从错误中学习和从成功中学习一样重要。6. 结语我的几点个人体会考完这套笔试到现在我自己也带过一些实习生回头再看这类题目感慨还挺多。笔试的内容并不算刁钻但它确实是一面很准的镜子能照出你基本功是否扎实。很多同学在准备时一头扎进最新最热的深度学习方向却忽略了3D视觉这个方向最底层的几何功底这在我看来是本末倒置。如果你现在还在校或者正准备投3D视觉岗我把最后一条建议放在这里别急着刷论文先花两周时间把相机模型、特征点、对极几何、RANSAC、ICP这几条主线捋清楚亲手推一遍公式再用代码实现一两个小功能。等你把这条主线跑通再回头看那些花哨的深度学习算法你会发现它们不过是解决经典问题的另一种工具而已。工具总是会换代但空间几何和优化的思维方式在3D视觉这个领域里永远不会过时。