
简介这是配套章毓晋《计算机视觉教程微课版 第3版》期末复习的习题集PDF面向正在备考计算机视觉课程的高校学生与自学者。汇集单选、多选、判断、简答与综合题覆盖距离计算、图像采集器件、相机成像与投影坐标、梯度与拉普拉斯算子、哈夫变换、形状分析、双目立体视觉、运动分析与动态背景建模等核心考点并提供解题参考与思路解析便于考前系统巩固。包体为1个PDF文件压缩包大小5.77MB轻量便携可配合教材与课件使用。已有4521人学习浏览适合需要期末冲刺、查漏补缺的读者。通过对照习题与解析可快速检验掌握程度理解公式推导与典型题型解法。1. 计算机视觉期末复习一份把计算题讲透的习题拆解计算机视觉这门课的期末复习最容易出现的状况是概念背了三天一看到带数字的题还是不知道从哪下手。我手头这份习题拆解把常见题型整体过了一遍——单选、多选、判断、简答、综合题都有从像素距离、图像采集器件、镜头成像到梯度算子、形状特征、双目视差和运动检测基本覆盖一门计算机视觉基础课能考到的计算点。它适合两类人临考一两周需要快速刷题的学生以及工作中需要补成像基础的技术从业者。我建议的直接用法是不看答案先做一遍计算题再对照解析检查——很多时候不是公式不会是单位和范数没有对齐。2. 距离度量与采集器件三个距离公式、三类传感器与出题套路2.1 欧式距离、城市距离与棋盘距离先分清 L1、L2、L8 范数题 1.10 这类题给两个像素坐标让计算它们之间的三种距离。三种距离对应的是不同的范数定义欧式距离是 L2 范数也叫直线距离城市距离是 L1 范数也叫曼哈顿距离等于坐标差绝对值之和对应只能沿 4 邻域路径走的情况棋盘距离切比雪夫距离对应 8 邻域路径取坐标差绝对值的最大值。import math p (1, 2) q (4, 6) d_euclid math.hypot(q[0] - p[0], q[1] - p[1]) d_city abs(q[0] - p[0]) abs(q[1] - p[1]) d_chess max(abs(q[0] - p[0]), abs(q[1] - p[1])) print(f欧式距离: {d_euclid:.4f}) print(f城市距离: {d_city}) print(f棋盘距离: {d_chess})这段代码直接按定义算三个值输出分别是 5.0、7、4。注意 math.hypot 内部就是用 sqrt((x2-x1)^2 (y2-y1)^2)比手动开方更稳。城市距离里“沿坐标轴走”是字面意思棋盘距离则是“允许斜着走走对角线也算一步”所以取最大值。做题时必须看清题目要的是 D4 还是 D8二者在坐标差(2,3)时一个是 5 一个是 3差距不小。常见考题变化是给一个距离值反推坐标范围例如“某点棋盘距离为 3 的像素有几个”答案是一个菱形区域。这类题不需要代码画出网格数一数最快。2.2 CCD、CMOS、CID传感器对比不只是背表格题 2.1 考图像采集装置这是典型的简答或判断考点。三类器件各有侧重点CCD 是 20 世纪 70 年代发展起来的电荷耦合器件快门速度快但工艺复杂、成本高CMOS 是 90 年代后普及的互补金属氧化物半导体器件低功耗、低成本、尺寸小手机摄像头基本都是它代价是噪声水平比 CCD 高大约一个数量级CID 是近年受关注的电荷注入器件支持随机访问、不产生图像浮散但光敏感度明显偏低。器件出现时间核心优势主要短板典型场景CCD1970s快门快、噪声低工艺复杂、成本高专业相机、科研成像CMOS1990s低功耗、低成本、尺寸小噪声比 CCD 高约一个数量级手机、消费级摄像头CID近年随机访问、无图像浮散光敏感度低特殊工业检测回答简答题时不要只写参数要带一句原理CMOS 把光电转换和信号读取电路集成在同一块芯片上所以功耗和成本低但噪声差CCD 的电荷逐行转移读出噪声控制好但制造门槛高。这个“为什么差异存在”的说明往往是拿分点。判断改错题里常见说法是“CMOS 噪声比 CCD 低”反过来就是错的还有“CID 光敏感度高”也错。复习时把表格里每一行的“优势—短板”一一对应起来基本不会丢分。3. 成像与投影计算镜头焦距、空间坐标和梯度算子的完整链路3.1 物像大小换算28mm 与 200mm 镜头下的成像尺寸题 2.2 给 10m 外一个高 3m 的物体问用 28mm 和 200mm 镜头拍摄时成像尺寸分别是多少。这里用的是薄透镜近似下的物像关系像高 / 物高 焦距 / 物距即 像高 物高 × 焦距 / 物距。题目物体在 10m 外远大于焦距像距近似等于焦距所以直接代公式。obj_h 3000 # 物体高度单位 mm dist 10000 # 物距单位 mm for f in [28, 200]: image_h obj_h * f / dist print(f{f}mm 镜头成像尺寸: {image_h:.2f}mm)输出是 28mm 镜头像高 8.40mm200mm 镜头像高 60.00mm。代码里我把所有长度统一成毫米再算这是这类题最容易翻车的地方——物距写成 10m 而焦距写成 28mm单位不统一会差 1000 倍。做题时先把物距、物高全部换算成毫米或者全部换算成米再代入公式。200mm 镜头成像尺寸是 28mm 镜头的 7.14 倍左右原因是焦距线性放大。考题若换成长焦镜头答案会明显变大换成广角镜头则要留意传感器靶面尺寸能不能装下像高这就是另一个引申考点。3.2 空间点投影摄像机坐标与图像平面坐标的换算题 2.3 给空间点 (-5m, -5m, 50m)用焦距 50mm 的镜头投影求摄像机坐标和图像平面坐标。这类题本质是针孔模型投影摄像机坐标系原点在光心Z 轴沿光轴方向图像平面坐标 通过 相似三角形 得到x f * X / Zy f * Y / Z。X, Y, Z -5.0, -5.0, 50.0 # 空间点坐标单位 m f 0.05 # 焦距单位 m x_img f * X / Z y_img f * Y / Z print(f图像坐标: ({x_img * 1000:.2f}mm, {y_img * 1000:.2f}mm))结果是 (-5.00mm, -5.00mm)。注意几个细节空间点坐标为负时投影坐标也为负图像平面坐标系原点在光轴与像平面的交点负坐标表示物点在光轴的另一侧焦距必须与空间坐标单位一致我把 50mm 写成 0.05m 就是为了统一单位。考题变体有两种一是给视场角 fov问物体能否被完整拍摄这时要结合传感器尺寸判断二是给旋转矩阵和平移向量求外参那就要先把世界坐标变换到摄像机坐标再做同样的投影。这份习题拆解里没有给外参所以直接用针孔模型即可不要自己加畸变或旋转。3.3 三种梯度算子罗伯特、普瑞维特、索贝尔的模板与合成方式题 3.1 要求用罗伯特交叉算子、普瑞维特算子和索贝尔算子分别计算一幅图像的梯度图并且“以 1 为范数”合成。三种算子的差别在模板尺寸和权重罗伯特算子用 2x2 邻域只对对角方向敏感计算量最小但对噪声也最敏感普瑞维特算子用 3x3 且上下左右权重一致索贝尔算子在 3x3 基础上把中心行或列权重加倍这样有一定的平滑噪声效果是工程里最常用的。算子Gx 模板Gy 模板特点罗伯特[[-1,0],[0,1]] 对角[[0,-1],[1,0]] 对角2x2 最小、快、噪声敏感普瑞维特3x3 水平差分3x3 垂直差分等权、边缘响应直接索贝尔中心列权重 2中心行权重 2平滑噪声、边缘更稳“以 1 为范数”在图里也有约定梯度大小 |Gx| |Gy|不是 sqrt(Gx^2 Gy^2)。考试时若不注意这个括号结果会和标准答案对不上。实际计算时对图像每个像素取对应邻域做模板加权求和得到 Gx 和 Gy再按 L1 范数合并。import numpy as np img np.array([ [10, 10, 10], [10, 50, 50], [10, 50, 50] ], dtypefloat) sobel_x np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) sobel_y np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]) def conv2d(img, kernel): hi, wi img.shape kh, kw kernel.shape pad_h, pad_w kh // 2, kw // 2 padded np.pad(img, ((pad_h, pad_h), (pad_w, pad_w)), modeconstant) out np.zeros_like(img) for i in range(hi): for j in range(wi): out[i, j] np.sum(padded[i:ikh, j:jkw] * kernel) return out gx conv2d(img, sobel_x) gy conv2d(img, sobel_y) grad np.abs(gx) np.abs(gy) print(Gx , gx) print(Gy , gy) print(L1 范数梯度 , grad)这段代码用最朴素的卷积实现便于看清模板滑动时发生了什么事。边界部分用补零处理中心像素周围没有完整邻域时补零会让梯度偏小这是手算和程序结果不一致的常见原因如果需要更准确可以用复制填充如 np.pad 的 modeedge。做题时题目如果不特别说明一般默认边界补零。索贝尔模板中心列用 2就是给水平方向的像素差更大权重等价于先做一次轻微平滑再做差分所以比罗伯特算子抗噪。3.4 拉普拉斯算子两个模板与符号约定题 3.2 用两个拉普拉斯模板处理同一幅图像。拉普拉斯是二阶导数算子输出的是灰度突变强度而非梯度方向。常见模板有两种四邻域版中心系数为 4周边四个方向为 -1八邻域版中心为 8周边一圈为 -1。前者只考虑上下左右后者带对角对噪声更敏感但响应更饱满。做题时先确认模板的符号约定。有的教材写成中心为正、周边为负有的反过来。卷积结果符号正好相反但边缘位置一致。如果题目问“拉普拉斯响应”而没给符号约定一般按模板直接算如果要求显示结果图取绝对值更符合直觉因为边缘是正负响应成对出现的。有个实用判断模板系数之和为 0是拉普拉斯算子的必要条件也是用来检查自己有没有抄错模板的标准之一。题 3.2 里给的两张图处理结果在灰度突变处会出现明显的“双重响应”这正是二阶导数的特征可以用来区分它和一阶梯度算子。3.5 形状特征参数与哈夫变换从离散顶点到直线检测题 8.1 计算八边形的外观比、形状因子、偏心率、球状性和圆形性。这五个参数衡量区域形状外观比用最小外接矩形的宽长比描述细长度形状因子用面积和周长的关系刻画圆度偏心率用最长弦与垂直方向最长弦的比值描述拉长程度球状性是内切圆半径与外接圆半径之比圆形性是区域中心到边界距离的均值与标准差之比。def polygon_area(points): n len(points) area 0.0 for i in range(n): x1, y1 points[i] x2, y2 points[(i 1) % n] area x1 * y2 - x2 * y1 return abs(area) / 2.0 def polygon_perimeter(points): n len(points) perimeter 0.0 for i in range(n): x1, y1 points[i] x2, y2 points[(i 1) % n] perimeter ((x2 - x1) ** 2 (y2 - y1) ** 2) ** 0.5 return perimeter pts [(0,0), (2,0), (3,1), (2,3), (0,3), (-1,2), (-1,1), (0,0)] print(面积:, polygon_area(pts)) print(周长:, polygon_perimeter(pts))polygon_area 用鞋带公式顶点必须按逆时针或顺时针连续排列否则面积可能带符号polygon_perimeter 直接累加相邻点距离。得到面积和周长后形状因子 4πA / P²圆度越好越接近 1。偏心率需要先找最长弦再找与它垂直方向上的最长弦这个需要旋转卡壳算法手算时通常按区域近似成椭圆来取长短轴。做题有个隐含要求离散点要先排序成多边形如果直接把题目图里的坐标连成自交多边形面积公式会算错。哈夫变换在题 3.7 里考的是直线检测思路把图像空间中的每个边缘点映射到参数空间的一条正弦曲线多个边缘点对应的曲线会在同一参数处相交相交峰值就是检测到的直线参数。换到 (ρ, θ) 参数空间的好处是对部分遮挡和断裂直线仍然有效。这道题常以判断或简答形式出现容易错的地方是把 θ 的取值范围和 ρ 的正负记反。复习时记住一句话图像空间的一个点对应参数空间的一条曲线参数空间的一个交点对应图像空间的一条直线。4. 形状特征与立体视觉五个指标、双目视差和运动检测方法4.1 参数坐标约定与 Z 坐标表达式双目视差的核心公式题 9.2 是典型的双目立体视觉计算题给出了两个摄像机光心连线中点作为坐标原点的设定需要推导关于 Z 的表达式并代入数值。设左摄像机光心在 (-B/2, 0, 0)右摄像机在 (B/2, 0, 0)光轴平行于 Z 方向物点 W(X, Y, Z) 在左右图像上的坐标分别是 x1 λ(X B/2)/Z 和 x2 λ(X - B/2)/Z其中 λ 是焦距。两式相减得到视差 d x1 - x2 λB/Z所以 Z λB/d两式相加得到 X Z(x1 x2)/(2λ)。lam 0.05 # 焦距单位 m B 0.4 # 基线距离单位 m x1 10.02e-3 # 左图像坐标按 mm 读入转为 m x2 -0.03e-3 # 右图像坐标按 mm 读入转为 m d x1 - x2 Z B * lam / d X Z * (x1 x2) / (2 * lam) print(f视差 d {d*1000:.3f} mm) print(fZ {Z:.3f} m) print(fX {X:.3f} m)输出约为z 坐标 1.990mx 坐标 0.199m。注意这段代码里我把 x1、x2 按毫米读入因为题目给出的 x110.02m 和 x2-0.03m 如果按“米”理解视差 10.05m 会推出 Z 0.4×0.05/10.05 ≈ 0.002m只有 2 毫米不符合双目系统拍 10 米外物体的实际情况。更合理的解读是这里的 x1、x2 单位为毫米或更小的图像坐标系单位代入前统一换算成米结果才正常。这个单位陷阱在真实工程里也常遇到处理办法是先估一个合理深度量级再反推坐标单位。符号上要注意x1 - x2 是“左减右”如果题目定义右图坐标为正方向相反结果会差一个负号Z 变成负数。遇到这种情况先画一个光心连线和中点坐标系的草图把两个成像平面坐标的方向标清楚再代公式。4.2 汇聚双目视差表达式与汇聚点的约束题 9.3 在 9.2 基础上加了汇聚条件两个摄像机的光轴不是平行而是汇聚在空间某点且汇聚点的 z 坐标是物点 W 的 z 坐标的 5 倍。要求写出视差表达式并计算具体数值。这时不能直接用平行光轴的 Z λB/d因为两光轴有夹角基线到物点的几何关系变了。常见推导思路是“汇聚点处视差为零”约束设汇聚点深度为 Zc则视差公式写成 d λB(1/Z - 1/Zc)。当物点在汇聚点上d 0物点比汇聚点近d 0物点更远d 0符合双目视觉的直觉。带入 Zc 5Z 得到 d (4/5)λB/Z。给 W(2,0,4)、B2、λ0.5 时Z4d 0.8×0.5×2/4 0.2单位与 λ 相同这里 λ0.5数字是示意。题里还给了 θ0.5这是两光轴与基线法线的夹角实际推导时要把 θ 显式表达进几何关系结果会变成带三角函数的形式而不只是 1/Z - 1/Zc 的简单差。代数值前先画图汇聚点深度与基线长度、夹角之间满足 Zc B/(2·tanθ) 这类约束如果已知量放进去对不上说明题目用了不同的坐标约定或夹角定义。复习时用“汇聚点视差为 0”这个性质去验证自己写的表达式比死记公式可靠得多。4.3 运动检测两种方法对比图像差与模型法的取舍题 11.3 是比较基于图像差和基于模型的运动检测优缺点这是简答题的高频考点。两种方法本质区别在“是否依赖先验模型”图像差方法直接对两帧或多帧相减不依赖任何背景先验实现简单、实时性好但对光照变化、阴影、遮挡和非刚性目标都很敏感模型方法先用若干帧学习背景模型再用当前帧与模型比较能适应动态背景和光照变化还能输出轨迹、速度等信息但计算存储开销大需要训练和调参遇到没见过的目标类型可能失效。维度基于图像差基于模型实现成本低直接帧差高需要训练实时性高较低复杂背景误检多稳健光照变化极易误检相对稳定额外信息只有运动区域轨迹、速度可提取场景举例简单监控、移动侦测交通监控、目标跟踪答题时按“优点两条、缺点两条、适用场景一条”组织就完整了。判断改错题里常把“图像差方法能适应动态背景”写成对的这是典型错误——帧差在树叶摇动的背景里会把背景边缘当成运动目标。还有的把“模型方法需要先验知识”说成缺点不够准确应该说“需要训练数据和模型参数调整”。4.4 高斯混合模型动态背景主要步骤和工程注意点题 11.6 要求归纳用高斯混合模型计算和保持动态背景的主要步骤。GMM 的思路是每个像素用多个高斯分布描述其灰度变化多个分布分别对应静止背景和周期性运动物体判断前景时看当前像素值能否被任一分布解释。步骤是第一步初始化背景模型通常用前几十帧的灰度均值作为第一个高斯分布的中心权重大一些第二步对每个新像素按当前值匹配已有高斯分布匹配条件是像素值落在该分布 2.5 倍标准差以内第三步更新匹配的分布参数权重按学习率 α 更新均值和方差按新的观测值做指数平滑第四步把权重与标准差比值ω/σ最大的几个分布作为背景其余作为前景分布当前像素如果没有匹配到任何背景分布就判定为运动目标。最后用形态学操作去除孤立噪声点得到干净的前景掩码。工程里要注意学习率 α 的取值太小会让背景更新很慢场景光影缓慢变化时前景会“渗入”背景太大又会让慢速移动的物体被吸收成背景。我一般先用 0.05 起步看前景掩码的闪烁程度再调。另外多高斯分布的个数通常 3 到 5 个太多增加计算量而收益有限。5. 避坑期末复习计算题最常翻车的六个细节5.1 单位与坐标类错误现象一双目视差算出来 Z 只有 2 毫米。代入题 9.2 原始数据时有人把 x110.02m、x2-0.03m 直接当成米得到 d 10.05mZ 0.4×0.05/10.05 ≈ 0.002m。一个 10 米外的目标算出 2mm 深度明显不合理。原因题目里图像平面坐标很可能实际是毫米10.02mm - (-0.03mm) 10.05mm 0.01005m而教材印刷时省略了单位说明。解决先做量级估算如果目标在 10m 外Z 应该在 1m 到 100m 之间再反推 x1/x2 的单位统一换算后计算。现象二投影坐标算出负数怀疑自己公式用错。空间点 (-5m, -5m, 50m) 投影结果是 x -5mm有人看到负号就改公式。原因没有意识到图像坐标系原点在光轴交点负坐标表示物点在光轴另一侧是正常结果。解决画一条从光心到物点的视线看它穿过图像平面的位置只要符号方向和物点一致就没错。5.2 范数与模板类错误现象三梯度大小该用 L1 范数却用了 L2 范数。题 3.1 明确写“以 1 为范数”结果还有人写出 sqrt(Gx² Gy²) 的形式。原因平时调用库函数默认梯度模长是二范数看到“范数”两个字就直接套。解决读题时圈出“以 1 为范数”或“以 8 为范数”L1 就是绝对值相加L8 是取最大值把句子和公式对应起来。现象四拉普拉斯模板符号约定与答案相反。同样的图模板写法不同会让响应的极性翻转。原因教材或课件里中心系数可能为正也可能为负不同教材约定不同。解决做题前先看模板系数之和是否为零再看题目给的结果图里边缘是亮还是暗据此调整自己手算结果的符号程序实现里如果要显示边缘图取绝对值最稳妥。5.3 模型与概念类错误现象五双目视差把 x1 - x2 写成 x2 - x1得到负数深度。原因不同教材对左右图像坐标正方向的定义不一致有的右图坐标方向向左为正有的向右为正。解决无论题目怎么定义先画坐标系草图标出左右光心和光轴方向再决定用哪个减哪个推导一次而不是凭记忆。现象六简答题把图像差方法与模型方法的缺点张冠李戴。比如写“图像差方法需要大量训练数据”完全说反。原因只背了关键词“模型”却没理解“先验知识”这条分界线。解决每答一题先问自己“这种方法需不需要提前知道背景是什么”——不需要的就是图像差需要的就是模型法然后围绕这个分界展开优点和缺点。这个方法在判断改错题里也通用。6. 最后一个技巧把习题拆解变成自己的变体重算工具复习到后期最有效的自测方式不是重复做原题而是把每一道计算题换成新数字重算。以镜头成像为例题目原题是 28mm 和 200mm 焦距各算一次我把公式参数化之后就可以批量生成不同焦距的答案检查自己对公式的理解是否稳定到“换个数字还能算”的程度。def image_height(f_mm, dist_m, obj_h_m): return obj_h_m * f_mm / (dist_m * 1000) for f in [28, 35, 50, 135, 200]: h image_height(f, 10, 3) print(f{f:3d}mm - {h:6.2f}mm)这段代码把物距固定为 10m、物高固定为 3m输出不同焦距下的成像尺寸。修改参数时你会发现 135mm 和 200mm 的差别在长焦端已经很小因为公式是线性的——这种“数值直觉”比背结论有用得多。同样的做法可以套到距离度量、投影坐标和双目视差上把 p、q 坐标换成 (0,0) 和 (3,4)把空间点换成 (2,-3,25)把 x1、x2 的符号反过来每题都重算一遍。我自己的习惯是考前两天专门做一轮这种“变体重算”原题只用来核对公式和思路变体题用来检验是不是真的会了。曾经有一次我以为自己掌握了双目视觉公式把数字改小后算出的视差是负数才发现坐标正方向定义没吃透当时想考试时再发现就迟了。从那以后我每次复习都强制走一遍“三变”变焦距、变距离、变坐标符号原题做对一次不算数变体能做对才收手。这个习惯对我来说确实管用也希望帮到你。本文还有配套的精品资源点击获取