☰
Metashape 1.8.2 Python API 参考手册:摄影测量自动化批处理实战指南
2026/11/2 12:31:45 网站建设 项目流程

简介:这份资源是面向 Metashape Professional 用户的 Python 脚本开发参考手册,对应 1.82 版本,适合已具备一定 Python 基础、希望将摄影测量流程自动化的测绘与三维建模从业者。内容围绕 Metashape 模块展开,涵盖 Document 类与项目数据的读写、块与相机的增删、相机校准与地面控制数据的修改、照片对齐、密集云构建、建模与纹理化等处理步骤的调用,以及模型、正射影像、DEM 的导出和网络任务控制,并附有模块索引与变更日志便于查阅。资源包共 1 个 PDF 文件,约 1.16MB,为官方英文参考文档,适合作为案头速查与脚本编写依据。目前已有 311 人学习,可帮助读者快速定位类与函数用法,减少在自动化流程搭建中的试错成本。

1. 拿到这份 1.8.2 参考手册,先搞清楚它能替你省掉哪些手工活

如果你手头有一批航拍或近景环绕拍摄的照片,要在 Metashape Professional 里跑完整套摄影测量流程——对齐、深度图、密集点云、网格、UV、纹理——那你大概率经历过这样的循环:点菜单、等进度条、改一个参数、再点一遍。照片从几十张涨到几百张,重复劳动的时间成本就开始失控。这份 Release 1.8.2 的 Python API 参考手册,解决的正是这个问题:它把 Metashape 里几乎每一个可点击的操作,映射成了 Python 3.8 环境下的类与方法,让你用脚本把整条处理链串起来,一次写好、批量复用。需要先说明一个硬性前提:Python 脚本只在 Professional 版里可用,Standard 版没有这个入口,别在错误版本上折腾。这份文档适合两类人:一类是想把摄影测量流程自动化的测绘、文保、工程从业者;另一类是手里有大量项目、需要统一参数口径的团队。它是一份 API 参考,不是教程,所以读法很关键——先建立对象模型,再挑自己流程里最痛的那一步下手。

2. 对象模型先立住:Document、Chunk、Camera 三层结构怎么对应你的项目

很多人第一次翻这份手册,会被几十个类名劝退。其实核心骨架只有三层,把这三层理顺,后面查任何方法都有落点。Metashape 的脚本世界是「文档—块—相机」的树状结构,所有处理动作都挂在某一层上。

2.1 Document 是项目容器,app.document 是当前打开的那个

Metashape.Document代表一个.psz项目文件,可以同时创建多个实例,互不干扰。但绝大多数脚本场景下,你操作的是界面上已经打开的那个项目,这时用Metashape.app.document直接拿引用,省去 open 的开销。手册里给的示例就是这条路子:先取doc = Metashape.app.document,再doc.open("project.psz")。这里有个容易忽略的点——open会替换掉当前文档内容,如果你在脚本里对未保存的修改有依赖,先doc.save()再 open,否则改动直接丢,没有后悔药。

Document下面挂的是chunks列表,一个项目可以有多个 chunk,对应不同的处理阶段或不同区域。doc.chunk是当前激活块,等价于doc.chunks[doc.active_chunk]之类的便捷写法。批量处理时我一般显式遍历doc.chunks,而不是依赖doc.chunk,因为激活状态是界面行为,脚本跑起来之后你没法保证它指向哪个。

2.2 Chunk 是处理单元,所有 build 系列方法都在这层

对齐、建深度图、建点云、建模型、建 UV、建纹理,这些方法全部是Chunk的成员。手册示例里那一串调用很典型:

import Metashape doc = Metashape.app.document doc.open("project.psz") chunk = doc.chunk # 照片对齐:downscale=1 表示不降采样,精度最高但最慢 chunk.matchPhotos(downscale=1, generic_preselection=True, reference_preselection=False) chunk.alignCameras() # 深度图降采样 4 倍,滤波用激进模式压噪点 chunk.buildDepthMaps(downscale=4, filter_mode=Metashape.AggressiveFiltering) chunk.buildDenseCloud() # 任意曲面 + 启用插值,适合非平面物体 chunk.buildModel(surface_type=Metashape.Arbitrary, interpolation=Metashape.EnabledInterpolation) chunk.buildUV(mapping_mode=Metashape.GenericMapping) chunk.buildTexture(blending_mode=Metashape.MosaicBlending, texture_size=4096) doc.save()

这段代码的逻辑是「一条龙」:matchPhotos只做特征匹配、不移动相机,alignCameras才真正求解位姿,两步分开是为了让你在匹配参数上做文章而不触发重算。downscale是精度与耗时的总开关,1 是原图、2 是半分辨率,往上每加一档速度大约翻倍、细节递减,实测里 2 是多数项目的甜点。filter_mode控制深度图滤波强度,AggressiveFiltering对植被、反光面这类噪声源压得狠,但薄结构(栏杆、线缆)容易被削掉,遇到这类目标要退回MildFiltering。buildModel的surface_type选Arbitrary是通用解,如果确定是地形或平面建筑立面,HeightField或Planar更快也更稳。texture_size=4096是纹理图幅边长,往上到 8192 显存吃紧,往下到 2048 细节明显糊,按最终交付精度定。

2.3 Camera 与 Calibration:内参外参在哪改

相机层是很多人卡住的地方。chunk.cameras是相机列表,每个Camera挂着Calibration对象,里面是焦距f、主点cx/cy、径向畸变k1~k4、偏心畸变p1~p4、仿射b1/b2。手册里Calibration类还提供了project(point)和error(point, proj)两个方法,前者把三维点投到像素坐标,后者算重投影误差——做精度自检时这两个比翻日志直观得多。如果你有外部检校报告,直接改calibration.f这些字段,再chunk.calibrateCameras()重算,比在界面里一个个填快得多。注意改完内参后必须重新对齐,否则位姿还是按旧内参解的,误差会系统性偏。

3. 三种执行入口怎么选:控制台、Run Script、命令行 -r

手册明确列了三条执行路径,选错入口会让调试效率差好几倍。这一章把三条路各自的适用场景和坑说清楚。

3.1 控制台面板:适合试探 API,不适合跑长任务

Metashape 的 Console 面板就是一个标准 Python 控制台,import Metashape之后可以逐行敲、看返回值。它的价值在于「不确定某个方法返回什么类型」时快速验证,比如type(chunk.cameras[0].transform)这种。但控制台是单线程阻塞的,你敲一个buildDenseCloud()进去,界面就卡在那儿等,中途想停只能强杀。所以我的习惯是:控制台只用来查对象、试参数,任何超过一分钟的处理都写成脚本文件走另外两条路。

3.2 Tools 菜单的 Run Script:带界面的脚本调试首选

Tools → Run script...选一个.py文件执行,好处是脚本跑在应用进程里,Metashape.app的所有界面相关能力都能用——弹文件选择框、弹消息框、更新进度。手册里Application类那一堆getOpenFileName、getSaveFileName、getCoordinateSystem、messageBox就是给这条路径准备的。写一个带参数输入的批处理脚本,用getExistingDirectory让用户选照片目录,比硬编码路径友好太多。缺点是脚本出错时异常栈显示在控制台里,得切过去看,而且脚本一旦跑飞,界面跟着卡。

3.3 命令行 -r:无人值守批处理的正确姿势

真正做批量、做定时任务,走命令行:

# Windows 下典型调用,-r 后面跟脚本路径 "C:\Program Files\Agisoft\Metashape Pro\metashape.exe" -r "D:\scripts\batch_build.py" # Linux 下同理,注意用绝对路径,工作目录不一定是脚本所在目录 /opt/metashape-pro/metashape.sh -r /home/user/scripts/batch_build.py

-r参数让 Metashape 启动后直接执行指定脚本,脚本跑完进程退出。这条路的坑集中在两点:一是脚本里不能用任何依赖界面交互的app.getXxx系列,无人值守时没人点对话框,会一直挂起;二是相对路径的基准是 Metashape 进程的工作目录,不是你脚本所在目录,所以脚本里所有路径要么绝对化,要么用os.path.dirname(__file__)拼。我一般会在脚本开头统一os.chdir到项目目录,后面全用相对路径,省得每处都拼。

提示:命令行模式下建议在脚本末尾显式Metashape.app.quit(),否则某些版本进程不会自动退出,批量调度器会以为任务没结束。

4. 参数怎么设:downscale、filter_mode、surface_type 的取值边界

这一章把最常调的几个参数单独拎出来,说清楚每个档位背后的代价,避免「照着示例抄、结果不对」的翻车。

4.1 downscale 的档位与耗时关系

matchPhotos和buildDepthMaps都有downscale参数,含义是「在原图基础上降几档再算」。取值是 1、2、4、8、16 这类 2 的幂。1 表示原分辨率,精度最高;每加一档,参与计算的像素数降到四分之一,耗时大致同比例下降。经验值:matchPhotos用 1 或 2,特征匹配对分辨率敏感,降太多会导致弱纹理区域匹配失败;buildDepthMaps用 2 到 4,深度图对分辨率没那么敏感,降采样换速度很划算。如果项目里照片是 4000 万像素以上,matchPhotos(downscale=1)可能一张图就要好几秒,几百张就是小时级,这时先降到 2 跑一版看对齐质量,没问题再决定要不要全精度重跑。

4.2 filter_mode 与 surface_type 的搭配

buildDepthMaps的filter_mode有NoFiltering、MildFiltering、ModerateFiltering、AggressiveFiltering几档。滤波越激进,孤立噪点压得越干净,但细小结构越容易丢。做建筑立面、机械零件这类硬表面,MildFiltering足够;做植被覆盖的地形,AggressiveFiltering能显著减少「毛刺」。buildModel的surface_type三选一:Arbitrary通用但慢、内存吃得多;HeightField适合地形,本质是 2.5D,不能有悬垂结构;Planar适合平面标定板、壁画这类。选错类型的典型现象是模型出现不该有的空洞或整体扭曲,这时先怀疑surface_type而不是点云质量。

4.3 用 Calibration.project 做精度自检

参数调完,怎么知道结果可信?手册里Calibration.project(point)把三维点投到像素坐标,配合error(point, proj)算重投影误差。写个小脚本抽查若干控制点:

import Metashape doc = Metashape.app.document chunk = doc.chunk cam = chunk.cameras[0] calib = cam.calibration # 取该相机下的一个投影点(示意,实际从 chunk 的投影数据里取) point_3d = Metashape.Vector((0, 0, 0)) proj_2d = calib.project(point_3d) print("投影像素坐标:", proj_2d)

project返回的是Vector,两个分量是像素坐标。实际自检时把已知控制点的三维坐标和它在照片上的量测像素坐标喂给error,返回值越小说明内参和位姿越一致。重投影误差普遍超过 1 到 2 像素,就该回头查内参或对齐质量,而不是继续往下建模型。

5. 避坑与排查:五条血泪经验

这一章全是踩过的坑,按「现象 → 原因 → 解决」写,遇到对应症状直接对号入座。

5.1 脚本在控制台能跑,命令行 -r 报 NoneType

现象:同一段脚本,Console 里逐行敲没问题,-r跑就抛AttributeError: 'NoneType' object has no attribute ...。原因:脚本里用了Metashape.app.document,但命令行启动时没有打开任何项目,app.document是空文档,doc.chunk返回 None。解决:命令行脚本一律显式doc.open(路径),不要依赖「当前打开的项目」这个隐式状态。

5.2 buildTexture 报显存不足

现象:buildTexture(texture_size=8192)跑到一半报 GPU 内存错误。原因:纹理图幅边长翻倍,显存占用大约翻四倍,加上深度图和点云还占着显存没释放。解决:先把texture_size降到 4096 验证流程能通,再逐步往上试;或者在 build 之前调Metashape.app.releaseFreeMemory()(手册里注明仅 Linux 有效,其他平台是空操作),Windows 下更实际的做法是分块处理、及时doc.save()后重开。

5.3 对齐后相机位置整体偏移

现象:alignCameras完成,相机位置和实际拍摄轨迹对不上,整体平移或旋转。原因:项目里带了参考坐标(GCP 或相机 GPS),但坐标系没设对,chunk.crs为空或设成了错误投影。解决:对齐前先chunk.crs = Metashape.app.getCoordinateSystem(...)或直接赋一个已知的CoordinateSystem对象,确保参考数据和项目坐标系一致,再跑对齐。

5.4 批量脚本跑到一半进程不退

现象:命令行批量处理,脚本逻辑跑完了,但进程一直挂着,调度器判定超时。原因:没有显式退出,或者某个app.getXxx对话框在无人值守时阻塞。解决:脚本末尾加Metashape.app.quit();同时全局搜一遍脚本里有没有getOpenFileName、getSaveFileName、messageBox这类交互调用,命令行模式下全部替换成硬编码路径或配置文件读取。

5.5 修改内参后结果反而更差

现象:按检校报告改了calibration.f和畸变系数,重新对齐后重投影误差不降反升。原因:改完内参没有触发重算,或者改的字段和 Metashape 内部约定不一致(比如焦距单位、主点原点位置)。解决:改完内参必须调chunk.calibrateCameras()让优化器重新求解,并且先用calibration.project在单张图上验证投影是否合理,确认无误再全量重跑。

6. 进阶:把处理链封装成可复用函数,并用 Settings 固化环境

写到后面你会发现,真正让脚本「可交付」的不是某一行 API,而是把整条链封装成带参数、带日志、带异常处理的函数,再用Settings类把环境差异抹平。手册里Settings提供了load()、save()、value(key)、setValue(key, value),以及log_enable、log_path、project_absolute_paths这些字段。我一般会在批处理脚本开头统一设置日志落盘和绝对路径存储:

import Metashape import os # 统一日志与路径策略,避免不同机器上行为漂移 settings = Metashape.app.settings settings.log_enable = True settings.log_path = os.path.join(os.path.dirname(__file__), "metashape_run.log") settings.project_absolute_paths = True settings.save() def build_pipeline(doc, chunk, tex_size=4096): """把一条龙处理封装成函数,参数外置便于批量调""" chunk.matchPhotos(downscale=2, generic_preselection=True) chunk.alignCameras() chunk.buildDepthMaps(downscale=4, filter_mode=Metashape.MildFiltering) chunk.buildDenseCloud() chunk.buildModel(surface_type=Metashape.Arbitrary, interpolation=Metashape.EnabledInterpolation) chunk.buildUV(mapping_mode=Metashape.GenericMapping) chunk.buildTexture(blending_mode=Metashape.MosaicBlending, texture_size=tex_size) doc.save()

log_enable打开后,每次处理的耗时和警告都会写进文件,批量跑几十个项目时,出问题直接翻日志定位,比盯着界面强。project_absolute_paths=True保证项目文件里存的是绝对路径,换机器打开不会因为相对路径解析失败而丢照片——这个坑在团队协作里特别常见,一个人用相对路径存了项目,另一个人拿到就全是红叉。封装函数时把tex_size、downscale这些做成参数,批量循环里按项目类型传不同值,比复制粘贴改数字可靠得多。

还有一个进阶技巧:Application.addMenuItem可以把你的脚本挂到 Metashape 菜单上,团队里不写代码的同事也能一键触发。配合getExistingDirectory选输入目录,一个「选目录 → 跑全流程 → 弹完成提示」的小工具就成型了,交付给非技术岗用很顺手。

从那以后我每次写批处理脚本,都会先把Settings的日志和绝对路径两项强制走一遍,再开始写业务逻辑——这两项不设,后面排查问题的成本远高于省下的那两行代码。希望帮到你。

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

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

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

立即咨询