☰
PhotoScan相机标定与畸变改正:从空三解算到干净影像的完整流程
2026/10/20 13:44:05 网站建设 项目流程

简介:面向Photoscan(现Metashape)用户的相机标定与畸变改正操作指南,内容聚焦三维重建中获取高精度模型的核心流程,适合测绘、无人机航测及三维建模初学者与工程师参考。资源为单个docx文档,约2.37MB,便于下载后按步骤对照查阅。该文档已有4768人学习,说明对相关从业者具有较高参考价值。文档系统梳理了相机标定的四个关键环节:添加影像、对齐影像(选择高精度)、优化相机参数与导出相机参数,并说明优化时可勾选焦距、主点及畸变系数等项目,以最小化图像坐标与三维空间点之间的差异;畸变改正部分则按添加影像、导入参数、导出未畸变影像三步展开,强调必须使用Photoscan自有格式的参数文件,否则无法正确读取;同时提醒用户在导出时选择所有相机并指定保存路径。文中还给出大规模测区下选取纹理丰富影像参与参数估算,以减少计算量并提升结果可靠性的实用建议,适合需要理清Photoscan相机参数处理全流程的用户。

1. 拿到一套影像先别急着建摸:相机标定和畸变改正是精度的分水岭

做近景摄影测量或者航测正射的时候,我踩过一个很典型的坑:同一台相机、同一批影像,建筑歪斜、边缘地物发虚,空三跑完报告里误差大得离谱。折腾了两天,最后发现问题是相机内参数根本没标定,镜头畸变参数全是默认值。从那以后,我养成了一个习惯——凡是进 PhotoScan 的项目,第一步永远是先解决相机内外参数,再谈对齐和建模。这套流程文档讲的就是这件事:先用 PhotoScan 的空三能力把相机内参与畸变系数解算出来,再对全测区影像做畸变改正,最后得到一批真正“干净”的未畸变影像。适合正在做三维重建、正射影像生产、或者需要用已知畸变参数批量纠正影像的从业者,尤其是常跟无人机倾斜摄影和多相机阵列打交道的人。

2. 标定到底在标什么:把空三当作一台隐式标定仪器

2.1 相机畸变的数学模型与 PhotoScan 的解法

相机标定的本质,是求解内参矩阵里的焦距 f、主点坐标 cx、cy,以及镜头畸变系数。畸变主要分两类:径向畸变和切向畸变。径向畸变来自于透镜形状,表现为画面边缘的直线变弯,通常用 k1、k2、k3 三个系数描述;切向畸变来自镜头装配时透镜与感光元件不平行,用 p1、p2 表示。PhotoScan 内部采用的是经典的 Brown 模型,对齐影像时默认同时解算这些参数,这一点和传统摄影测量里单独做检校场标定有本质区别——传统方法是拿已知控制点反推参数,PhotoScan 则是利用影像间充足的重叠度,靠多视几何关系自标定。

自标定的优势在于不需要额外的标定板或者检校场,劣势在于对影像质量和重叠度非常敏感。影像数量不够、纹理单一、或者快门模糊严重,解算出来的参数可能就是一组“数值上收敛、物理上离谱”的结果。我一般会在标定前快速翻一遍影像,剔除明显失焦和过曝的帧,避免劣质影像把整个空三带偏。

2.2 添加影像的重叠度底线

标定流程第一步是添加影像。这里的核心不是“把照片拖进去”那么简单,而是要对影像集合的分布做约束。实操上,我建议每两张相邻影像的重叠度不低于 60% 到 80%,对于标定来说更保险的是让同一个地物点出现在至少 3 张影像里。这样空三才能构建足够多的冗余观测,把内参和外参解耦开。

在 PhotoScan 里添加影像的方式有两种:一种是直接拖拽文件夹到工作区,另一种是通过“工作流程—添加照片”对话框选择。需要注意,如果影像名含有中文或特殊字符,软件在后续处理中偶尔会出编码问题,我一般会提前把影像重命名为纯英文和数字的组合,例如 IMG_20240601_001.jpg 这种格式。

2.3 对齐影像时的高精度选项意味着什么

对齐影像这一步,在 PhotoScan 里面对应的是空三解算。菜单路径是“工作流程—对齐照片”,这里有几个关键参数设置,直接影响标定精度:

参数项推荐设置说明
对齐精度高使用原始分辨率影像提取特征点,标定的内参更稳
成对预设通用适合大多数场景;近景可试“运动”模式
关键点限制40000每张影像处理的特征点上限,越大越慢
连接点限制4000每张影像最多保留的匹配点数量

很多人为了省时间选“中”甚至“低”精度,这在纯建模项目里可能还能勉强接受,但如果是拿这个项目结果当标定依据,我强烈建议无论如何都要跑一次高精度。因为低精度对齐时,Pyramids 层级的降采样会让特征点定位精度下降,最后解算出的焦距和畸变系数带上了系统性的定位误差。等到用这些参数去做畸变改正时,边缘的改正量可能偏差几个像素,近距离摄影测量时这种偏差直接就变成模型变形。

对齐完成后,最好先看一眼“工具—对齐照片”生成的稀疏点云,检查有没有明显的分层、飞点或者大范围空洞。这些现象往往意味着匹配错误,这时候直接进入优化环节,得到的内参也是错的。

2.4 优化相机参数的勾选策略

对齐完影像之后,菜单路径“工具—优化相机”打开对话框,里面列出了所有可以参与优化调整的相机参数。默认勾选的是 f、cx、cy、k1、k2、p1、p2。这套默认组合是经过大量项目验证的稳定起点,我个人在标定阶段一般不改动它。

k3 这个系数描述的是大畸变镜头的边缘像差,普通视角的镜头强行放开 k3 很容易和 k1 互相耦合,造成参数之间“打架”。怀疑自己的镜头畸变很厉害时,正确的做法是先勾上 k3 跑一次,保存结果后用“工具—导出—相机参数”导出 XML,在文本编辑器里看 k3 的数值是否稳定;如果两次标定 k3 的符号和量级都不一致,果断去掉 k3 重新优化。

优化相机参数的原理是通过最小化重投影误差,同时调整内参、外参和连接点的三维坐标。这一迭代过程对初始值很敏感,而初始内参其实来自 EXIF 信息里的焦距和光圈值。因此添加影像前,检查每一张的 EXIF 是否被后期软件清洗过也很重要——如果影像被转存过一次导致 EXIF 丢失,PhotoScan 只能靠默认值启动优化,很容易收敛到局部极小值。

2.5 导出相机参数时选对格式是后话的前提

优化完成后,“工具—导出—相机参数”会生成一个 XML 文件。这一步普通用户经常忽略一个关键点:导出对话框里可以选择不同格式,包括 PhotoScan 自定义格式、Bingo 格式、iWitness 格式等。如果后续打算直接在 PhotoScan 里做畸变改正并导出未畸变影像,必须选择 PhotoScan 自定义格式,这一点文档里也特别强调了。

其他格式虽然也能输出畸变系数,但当你把它们重新导入 PhotoScan 时,软件对非原生格式的兼容性并不保证。我在测试中遇到过一种情况:用 Bingo 格式导出,再通过相机参数界面的“导入”按钮读回去,结果是照片窗口里的影像完全没变,导出的未畸变影像和原图叠在一起看不出区别,查了很多圈才发现是格式解析丢掉了部分畸变模型信息。

3. 畸变改正的规模化路线:局部标定、全局改正

3.1 为什么不对所有影像做标定而要选子集

文档里提到一个很关键的经验:测区影像数量大时,用全部影像做畸变参数解算,计算量剧增,而且质量差的影像会拉低参数估计的精度。这一点我自己在真实项目里深有体会——一个 5000 张影像的倾斜摄影项目,跑一次高精度空三要 6 个小时以上,而真正影响畸变参数收敛的,其实是那些纹理丰富、重叠度高的局部影像块。

正确做法是挑一个地形起伏明显、纹理细节丰富的子区,影像量控制在 100 到 200 张左右,单独建一个项目执行完整的标定流程。纹理丰富的意义在于给特征点匹配提供足够的“抓手”,让空三解算出的畸变参数不是靠插值撑起来的。挑选时可以优先选包含建筑立面、道路标线、岩石纹理这类高对比度地物的影像,避免大片天空、水面、雪地这类无纹理区域。

3.2 导入畸变参数:格式不对等于白干

畸变改正的第一步还是添加影像,但这里的添加范围是全部待处理影像,不需要再进行对齐。操作路径是选中所有影像后,“工具—相机参数”打开相机标定面板,左下角有导入按钮,选择之前保存的 PhotoScan 原生 XML 文件导入即可。

导入成功后会看到相机内参栏里的 f、cx、cy 和畸变系数全部被填入,不再是默认的灰显状态。这里最常见的坑是导入之后参数显示没有问题,但实际改正时软件只对标签与 XML 中一致的相机生效。如果你的项目里有多个相机标签(比如无人机前视、下视、倾斜相机分成好几个 Sensor),必须逐个确认每个相机都被导入了对应参数。操作上我一般会用一个笨办法:导入完参数后,在面板里逐个点击相机标签,肉眼确认每一组的焦距数值各不相同且和标定结果一致,再做下一步导出。

3.3 导出未畸变影像:最后一步的细节决定成败

导出未畸变影像的菜单藏在“工具—导出—未畸变影像”,不是“文件—导出”,很多新手会在文件菜单里找半天。点开后对话框会列出项目里的所有相机,默认是全选,保留全选即可,然后指定输出文件夹,软件就会按相机名作为子目录,生成一系列的 JPG 或 TIFF 文件。

保存格式上,我习惯选 TIFF,虽然占空间,但 16 位无损格式保留了最多的灰度信息,后续如果要做像素级的特征匹配,比 JPG 的 8 位有损压缩稳得多。还需要注意的是 PhotoScan 的“未畸变影像”输出并不会自动帮你做色彩校正,只做几何畸变改正,输出的影像范围和原图略有不同,边缘部分会出现轻微的黑边和拉伸,这都是正常现象。如果后续还要把这些影像用于其他软件的空三,黑边会让特征点提取在边缘处产生误匹配,建议在导出之前先在影像上画好多边形 mask 把无效区域剔掉,或者导出后用脚本批量裁剪。

3.4 未畸变影像的生产用途

拿到改正后的影像,可以把它当作“干净数据源”供其他流程复用。常见做法是在 PhotoScan 里重新建一个项目,添加这些未畸变影像,此时相机参数可以全部重置为默认值,因为影像已经是理想针孔模型下的投影,不再需要畸变补偿。这样做的好处是空三的运算量会明显下降,因为不需要在每次迭代里反复计算畸变改正项,对齐速度更快,模型纹理贴合也更精准。

另一种用途是输出给第三方软件做密集匹配或者立面测绘。很多做立面测量的朋友习惯直接在 CAD 里贴照片,如果贴的是畸变原图,拉出来的尺寸线在画面边缘部分和实际差距可达几十像素,换算成毫米在近景摄影测量里就是几厘米的误差。必须先改正再贴图。

4. 参数优化的进阶控制:从默认勾选到逐项调整

4.1 相机参数优化面板的每一项:勾或不勾的区别

PhotoScan 的“优化相机”面板里,参数分为两组:内部参数(Internal)和外部参数(External)。外部参数是指每张影像的位置和旋转角,默认全选;内部参数就是我们关注的相机内参。面板里可勾选的畸变系数包括 k1、k2、k3、k4 以及 p1、p2,部分版本还支持更高阶的非对称系数。

参数含义何时勾选何时不勾
f焦距(像素单位)默认勾选,标定时必选已知焦距极稳时可固定
cx, cy主点坐标默认勾选影像数量少时建议固定
k1, k2主要径向畸变默认勾选镜头畸变很小时可去掉 k2
k3大畸变补充项大广角或鱼眼镜头普通镜头且数据量小时
k4更高阶径向畸变极端畸变镜头常规项目基本用不到
p1, p2切向畸变默认勾选装配精良的工业相机可尝试去掉

我实际项目里最常见的翻车操作是:标定影像只有 30 张,却把 cx、cy 和 k3 全部放开,最终空三跑完报告里焦距 f 的误差标准偏差直接飙到 1.5 个像素,然后拿这套参数去改正 1000 张影像,结果是影像中部尚可,边缘处出现不可忽略的波浪形扭曲。原因就是观测数量不足,内参之间产生了强相关性,解算矩阵病态。

正确的做法是分级放开:第一次优化只勾 f、k1、p1、p2,提交后看误差报告;如果重投影误差在 0.5 像素以内,再加 k2 和 cx、cy 再跑一次;每一步都保存新版本的项目文件,这样即便某一步跑飞了,还能有后悔药可以回退。

4.2 对齐精度与标定精度的量化关系

在高精度对齐时,PhotoScan 每个特征点的定位精度理论上可以达到亚像素级别,但实际受限于影像噪声和光照变化,一般能到 0.3 到 0.5 像素的重投影误差。这个数值在哪里看?在“文件—导出—导出自适应报告”里生成的 HTML 报告,或者“窗口—质量报告”里直接打开。报告里的 “Camera location error” 和 “Camera calibration error” 两个指标是标定质量的核心判据。

Camera calibration error 通常拆成每个参数的误差值,单位是像素。我的经验阈值是:f 的误差小于 0.1 像素,cx、cy 的误差小于 0.5 像素,k1 的误差相对值小于 5%,这套参数才算能用。如果误差指标超过这个范围,我会先回退到上一个节点,增加影像数量或者改换特征点提取设定(比如把关键点限制从 40000 提到 60000),而不是继续在错误参数上做改正。

4.3 网格划分与分区块标定的组合用法

超大测区时,单次标定不一定能覆盖相机姿态的全部变化范围。尤其是无人机倾斜摄影,相机在不同方向上的姿态差异大,只用其中一组影像标定的畸变参数,换到另一个飞行方向后改正效果会衰减。常见做法是把测区按航线分成 4 个区块,每个区块独立做一次标定,然后对比各区解算出的参数组。

如果几组参数之间高度一致,说明相机状态稳定,可以直接取平均参数做全测区改正;如果差异明显,就要考虑是不是相机在飞行过程中受到了振动影响或者温度漂移导致的焦距变化。这时候我的习惯是分区分别改正,而不是强行用一个全局参数硬套。PhotoScan 支持在同一个项目里定义多个相机标签,每个标签配一套参数,正好对应这种分区块改的思路。

5. 常见问题排查:标定改正的五个坑位复盘

5.1 导入畸变参数后,导出的未畸变影像和原图没有区别

现象:按照流程导入 XML 参数,再执行“工具—导出—未畸变影像”,得到的输出影像和原图叠在 PS 里基本重合,边缘直线仍然是弯的。

原因:最常见的是导入参数时没有作用到实际影像对应的相机标签。PhotoScan 的相机参数是按相机标签(Sensor)存储的,如果项目里有多个 Sensor,而导出参数时只选了一个 Sensor,重新导入时其他 Sensor 的畸变模型还是空置状态。还有一种可能是导入的 XML 是 Bingo 或者其他第三方格式,软件解析时畸变系数没有完整映射到 Brown 模型里。

解决:在导入前,先确认当前项目的相机标签与标定项目里的标签名称一一对应。不一致时,手动在“工具—相机参数”里修改标签名,使其与 XML 中的 Sensor 名匹配,然后重新导入。

5.2 高精度对齐后,焦距变成负值或者异常大

现象:对齐完成打开相机参数面板,焦距 f 的值和 EXIF 里标称值差出数倍,甚至出现了负焦距,稀疏点云呈明显的球形畸变。

原因:这是典型的空三自由网解算发散,本质原因是影像重叠度不足或者特征点分布不均匀。焦距的初始值可能没有被正确读取(比如 EXIF 缺失,软件用了默认值),优化过程里迭代冲出合理范围。

解决:先手动在相机参数面板里把焦距改成 EXIF 标称值换算出像素焦距,然后在对齐照片时勾选“猜测相机焦距”选项(其实是默认开启,但可以重复点击触发重新猜测)。如果还不收敛,就先固定 cx、cy 不参与优化,只让 f 和畸变系数跑,迭代稳定后再放开 cx、cy 重新优化。

5.3 优化的精度报告好看,但畸变改正的影像边缘有锯齿

现象:质量报告里重投影误差只有 0.3 像素,但导出未畸变影像后边缘直线附近有明显锯齿和振铃。

原因:问题往往不出在标定,而出在导出环节。PhotoScan 的未畸变影像是通过重采样生成的,重采样默认的插值算法是双线性,对边缘高频纹理的表现不佳。此外,如果原图是高压缩比的 JPG,块效应会被畸变改正放大,看起来像锯齿。

解决:导出对话框里检查是否有插值方式选项,有则改为更高质量模式;没有的话,输出为 TIFF 后自己写一个双三次插值的重采样脚本处理。同时尽量用原始 RAW 转出的高质量 PNG 或未压缩 TIFF 做输入,避免二次压缩。

5.4 标定项目跑得飞快,但细看连接点全都是短基线匹配

现象:对齐照片完成速度出乎意料地快,常规几百张影像的项目只花了十几分钟,但查看稀疏点云时,发现大量连接点只分布在相邻两张影像之间,延长基线后的交会角很小。

原因:高精度对齐时特征点提取的尺度范围不足,或者影像之间存在严重的亮度差异,导致多视匹配失败,软件退而求其次只找到满足最小要求的短基线匹配。这样的观测网络对内参解算来说约束不足,标定结果脆弱。

解决:在“工具—偏好设置—立体视图”里没有直接调整项,正确的操作是回到对齐照片阶段,把“成对预设”从通用改为“运动”,或者把关键点限制数值调高,让匹配算法有更大的候选池。如果还不行,就需要在测区内增加补拍影像,专门强化长基线的连接关系。

5.5 多相机阵列中,部分相机导出的未畸变影像大小不一致

现象:一个五相机倾斜载荷,导出未畸变影像后,五个相机对应的子目录里影像尺寸不一致,有的还是原始尺寸,有的是改了之后的尺寸,直接导致后期拼接时分辨率不统一。

原因:每个相机的传感器尺寸和畸变模型不同,改正后的有效成像区域也就不一样。PhotoScan 会按照改正后的包围盒重新计算输出尺寸,所以不同相机之间影像行列数不齐是正常现象。

解决:不要试图让软件强行统一尺寸,而是在后期处理流程里,以分辨率最低的那个相机为基准,对输出影像统一缩放。我一般的做法是取五个相机输出尺寸的最大公约数作为目标宽高,再用脚本批量 resize。

6. 进阶技巧:用关键连线法快速验证畸变改正是否到位

畸变改正到底做得好不好,不能只看 PhotoScan 报告里的数字,得落到影像本身。我习惯用一个很基础的验证方法:在原始影像和改正后影像上分别找同一个具有长直线边缘的物体(比如建筑轮廓、球场边线),用画线工具沿着直线边缘放置若干个标记点,然后对比这些点在两幅影像上的弯曲程度。

具体操作可以用任何支持图层对比的软件,也可以写一段简单的 Python 脚本提取直线边缘的位置,量化边缘曲率。我通常会在改正后的影像上画 20 条左右的横向和纵向参考线,用最小二乘法拟合直线,计算残差的标准差。残差均值应该接近 0,标准差应该小于 0.5 像素,超过这个值就要回到优化阶段重新检查参数组合。

如果时间紧张,还有一个更直接的技巧:在 PhotoScan 里把改正后的未畸变影像重新添加为一个新项目,设置为飞行器模式并填入已知的地面分辨率,然后让空三跑一次刚体变换。如果改正到位,这次空三的重投影误差应该保持在 0.3 像素以内,而且不需要再做任何内参优化——之前标定出的参数已经不再需要参与迭代,这一点可以作为流程闭合的判定依据。

那一回我用这个方法检查出自己导出的 XML 里 k2 参数符号反了,肉眼完全看不出来,但量化后残差标准差到达 2.1 像素,回去重新看了一下才发现原来标定项目里 k2 的数值方向和镜头实际畸变方向不匹配。从那以后,我每次做完全套标定和改正流程,都强制自己走一遍关键连线的量化验证,不达标就回炉重来。希望这份流程能帮你在自己的项目里少走一次这样的弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询