news 2026/11/4 12:54:21

MVS参数配置实战指南:从青铜器重建看多视图立体匹配调参逻辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MVS参数配置实战指南:从青铜器重建看多视图立体匹配调参逻辑

1. 项目概述:MVS不是“神秘视觉系统”,而是三维重建的工业级基石

很多人第一次看到“MVS”三个字母,下意识会联想到某种新出的AI视觉模型,或者某个小众开源库——其实完全不是。MVS是Multi-View Stereo(多视图立体匹配)的缩写,它不是某个具体软件,而是一套成熟近三十年的计算机视觉底层方法论,核心任务就一个:从一组已知位姿(即相机拍照片时的位置和朝向)的二维图像中,高精度地反推三维空间点云和稠密网格模型。你手机里用AR扫描房间生成3D户型图、影视特效中把实拍演员抠进虚拟场景并保持真实光影遮挡、某高校实验室用无人机航拍农田后生成厘米级高程模型——背后都绕不开MVS这道关键工序。它不负责自动识别物体、也不做风格迁移,但它是所有需要“从照片建真三维”的场景里,最不可替代的“造物引擎”。标题里括号中的“(—)”,我猜是原始笔记里随手打的分隔符,但恰恰提醒我们:MVS本身没有花哨界面,它的力量全藏在参数配置里——调对了,0.5毫米精度的工业零件也能重建;调错了,连一张平整桌面都会扭曲成波浪形。这篇文章不讲抽象公式,只说我在过去五年里,用MVS处理过建筑扫描、文物数字化、工业质检等十余类真实项目后,总结出的参数配置逻辑链、避坑清单和可直接抄作业的配置模板。无论你是刚跑通COLMAP报错的新手,还是被客户反复质疑“为什么模型边缘发虚”的工程师,这里的内容都能让你少踩三天坑。

2. MVS技术选型与工作流拆解:为什么必须先放弃“一键傻瓜化”幻想

2.1 主流MVS工具链的真实能力边界

市面上常被提及的MVS工具,实际分属三个层级,混淆它们是多数人配置失败的根源:

  • 第一层:SfM+MVS一体化工具(如COLMAP、Meshroom)
    它们把运动恢复结构(SfM)和多视图立体匹配(MVS)打包成一个流程。优点是开箱即用,缺点是MVS阶段参数暴露有限。比如COLMAP的patch-match-stereo模块,表面只有--max_image_size和--depth_map_path两个入口,但背后真正影响精度的--window_radius(匹配窗口半径)、--sigma(光度一致性权重)等27个参数,全被封装在二进制里无法调整。我曾用Meshroom重建一座石桥栏杆,因默认参数过度平滑,导致雕刻纹路全部糊成一片,最后不得不导出深度图手动重算。

  • 第二层:专业MVS引擎(如OpenMVS、CMVS/PMVS2)
    这才是参数配置的主战场。OpenMVS提供完整的C++ API和命令行接口,所有核心参数均可显式控制。它的优势在于:支持GPU加速的PatchMatch算法、可自定义法线一致性约束、能输出带置信度的深度图。但代价是学习曲线陡峭——你得先理解什么是“极线约束”、为什么--min_num_views设为3会导致孔洞,设为8又会让计算时间翻四倍。

  • 第三层:工业级定制方案(如某公司内部MVS模块)
    这类方案通常基于OpenMVS二次开发,针对特定场景(如金属反光件扫描)固化了参数组合,并加入硬件协同优化(如配合双目结构光相机同步触发)。普通用户接触不到,但它的存在说明了一件事:没有万能参数,只有场景适配参数。

提示:如果你的任务是重建光滑塑料外壳,优先用COLMAP+OpenMVS组合;如果是重建毛石砌体古墙,必须上OpenMVS并手动调参;若涉及镜面反射或透明材质,所有通用MVS工具都会失效,需额外加装偏振滤光片——这是物理层面的限制,再好的参数也救不了。

2.2 典型工作流的四个不可跳过环节

MVS不是“导入图片→点击运行→导出模型”的黑盒,它由四个强耦合环节构成,任一环节参数失配,后续全盘作废:

  1. 图像预处理环节:解决光照不均、运动模糊、镜头畸变问题。

    • 关键参数:--undistort(是否校正畸变)、--gamma_correction(伽马值,0.8适合暗场,1.2适合逆光)
    • 实测教训:某次扫描青铜器,未开启--undistort,重建后器物口沿出现0.3mm环形错位——这是镜头畸变在三维空间的几何放大。
  2. 稀疏重建(SfM)环节:确定每张照片的精确位姿。

    • 关键参数:--min_match_score(特征匹配阈值,0.6太松易误匹配,0.85太严致位姿丢失)
    • 经验技巧:对纹理贫乏物体(如白墙),必须人工添加控制点,否则SfM会把整面墙重建为平面,后续MVS无从计算深度。
  3. 稠密匹配(MVS核心)环节:逐像素计算深度。

    • 关键参数:--max_photo_num(参与匹配的最大影像数)、--min_consistent_photo_num(最小一致影像数)
    • 逻辑解析:设--max_photo_num=10,系统会为每个像素挑选视角差异最大的10张图参与计算;但若其中仅3张图结果一致(--min_consistent_photo_num=3),该像素深度即被采纳。这个“一致性”阈值就是抗噪关键——设太高(如6)会丢细节,设太低(如2)会引入大量飞点。
  4. 网格生成与优化环节:将深度图融合为三角网格。

    • 关键参数:--space_carving(空间雕刻强度)、--max_point_dist(最大点距,决定网格密度)
    • 现场记录:重建0.5m×0.5m电路板时,--max_point_dist=0.05生成200万面片,--max_point_dist=0.1仅50万面片,但焊点轮廓已模糊——精度损失不可逆。

整个链条像一条精密流水线:前道工序的误差会被后道指数级放大。因此,参数配置绝不能孤立看待,必须建立“预处理→SfM→MVS→网格”的全局敏感度认知。

3. 核心参数配置详解:每个数字背后的物理意义与实操选择逻辑

3.1 图像预处理参数:让相机“看清”而非“拍亮”

预处理看似简单,实则决定MVS能否启动。我见过太多案例:用户抱怨“重建失败”,实际只是因为没校正镜头畸变。

  • --undistort(畸变校正开关)
    必须开启。原理是:广角镜头拍摄时,直线会弯曲(桶形畸变),MVS算法假设光线沿直线传播,若输入弯曲图像,计算出的三维点必然偏移。实测数据:使用GoPro Hero9拍摄的120°广角图,关闭校正时重建误差达1.2mm/m,开启后降至0.08mm/m。校正需提前标定相机内参(焦距、主点、畸变系数),用OpenCV的calibrateCamera函数即可完成,标定板建议用A4纸打印的棋盘格(40mm方格),拍摄15个不同角度。

  • --gamma_correction(伽马校正)
    数值范围0.1~2.0,本质是调整图像亮度响应曲线。人眼对暗部更敏感,相机传感器却是线性响应。当场景明暗对比强烈(如室内窗边),不校正会导致暗部细节丢失,MVS因缺乏纹理特征而无法匹配。我的经验公式:
    伽马值 = 1.0 + (平均亮度 - 128) / 255 × 0.5
    其中平均亮度用ffmpeg -i input.jpg -vf "signalstats=stat=brng" -f null -提取。例如,扫描深色木雕时平均亮度为65,代入得伽马值≈0.87,此时暗部纹理清晰度提升3倍。

  • --resize_factor(图像缩放因子)
    常见误区是“越大越好”。实际上,MVS计算复杂度与图像分辨率平方成正比。12MP图像缩放到50%(约3000×2000),计算时间减少75%,但精度损失仅0.15mm(在1m距离内)。我的取舍原则:

    • 精度要求<0.1mm(如微电子元件):不缩放,但必须用工作站级GPU(RTX 4090)
    • 精度要求0.1~0.5mm(如机械零件):缩放至70%
    • 精度要求>0.5mm(如建筑外立面):缩放至50%,省下的时间可用于增加拍摄角度

注意:缩放必须用双三次插值(-vf "scale=trunc(iw*sar*oh/ih):oh:flags=lanczos"),禁用最近邻插值,否则会引入锯齿伪影,导致MVS误判边缘。

3.2 SfM环节参数:给每张照片一个“身份证”

SfM输出的相机位姿(旋转矩阵R和平移向量t)是MVS的基石。参数配置错误,MVS再精准也是空中楼阁。

  • --min_match_score(特征匹配最低得分)
    COLMAP中此参数控制特征点匹配的严格程度。得分基于描述子距离比(Lowe's ratio test),0.6表示允许60%相似度的点对匹配。测试数据:在纹理丰富的砖墙场景,设0.6时匹配点数23000,位姿解算成功;设0.85时仅剩8000点,导致部分相机位姿解算失败,重建区域出现大块空白。但若场景是纯色金属板,0.6会引入大量误匹配(如把反光点当特征),此时必须提高到0.75,并辅以人工控制点。

  • --max_reproj_error(最大重投影误差)
    单位像素,指将三维点投影回图像平面时,预测位置与实际特征点位置的最大允许偏差。设为2.0是通用起点,但需根据镜头焦距调整:
    合理值 = 2.0 × (实际焦距 / 标定焦距)
    例如,用50mm镜头拍摄,但标定时误用35mm,则实际误差被放大1.4倍,此时应将阈值设为2.8。否则合格点被剔除,位姿精度下降。

  • --init_min_tri_angle(初始三角化最小夹角)
    决定哪两张图可用于初始化三角化。夹角太小(如5°),基线过短,深度计算不稳定;夹角太大(如60°),可能因视角差异过大导致匹配失败。我的黄金区间是25°~45°。实测:扫描圆柱形陶罐时,强制设置夹角为50°,重建后罐身出现螺旋状扭曲——这是大视角差导致的深度歧义。

3.3 MVS稠密匹配参数:深度计算的“投票机制”

这才是标题中“参数配置”的核心战场。OpenMVS的ReconstructMesh命令有18个关键参数,我按影响权重排序如下:

参数名推荐值物理意义调整逻辑
--max_photo_num8~12每个像素最多参与匹配的影像数场景越复杂(如枝叶交错),值越大(12);越规则(如平面),值越小(6)
--min_consistent_photo_num3~6最小一致影像数噪声大(如手持拍摄)设3;稳定三脚架设5;要求极致精度(如计量检测)设6
--window_radius3~7匹配窗口半径(像素)小值(3)保细节但易受噪声干扰;大值(7)抗噪强但模糊边缘。我的公式:半径 = round(0.001 × 图像长边)
--sigma0.2~1.0光度一致性权重值越大,越信任像素亮度相似性。反光材质(如陶瓷)设0.3;哑光材质(如石膏)设0.8
--min_patch_distance0.05~0.2最小补丁距离(米)控制深度图稀疏度。0.05生成超密深度图(适合小物体),0.2适合大场景
  • --window_radius的实操验证:重建一枚1元硬币(直径25mm),图像分辨率为4000×3000。按公式计算:round(0.001×4000)=4。设半径为4时,边缘锐利;设为2,齿形边缘出现毛刺;设为6,齿形被平滑成圆弧。这印证了“窗口大小需与目标特征尺度匹配”的原理。

  • --sigma的材质适配:拍摄釉面瓷碗时,--sigma=0.8导致碗壁大面积空洞(因反光区亮度突变被判定为不一致);降至0.25后,空洞消失,但碗底文字细节略有模糊。最终采用分区域策略:用Mask标注反光区,对该区域单独设--sigma=0.2,其余区域用0.6。

3.4 网格生成参数:从点云到可用模型的最后一道关卡

MVS输出的是深度图或点云,真正交付客户的是网格模型(.obj/.stl)。参数选择直接决定模型能否3D打印或CAE仿真。

  • --max_point_dist(最大点距)
    直接控制网格密度。单位为世界坐标系(米)。常见错误是设得过小:某用户重建1m长机械臂,设--max_point_dist=0.001(1mm),生成1.2亿面片,软件直接崩溃。我的分级标准:

    • 打印级精度(0.1mm):0.0001
    • 工业检测(0.5mm):0.0005
    • VR展示(2mm):0.002
      计算公式:推荐值 = 0.5 × (目标精度 × 2),其中×2是留出曲面拟合余量。
  • --space_carving(空间雕刻强度)
    作用是剔除深度图中不可达的“幽灵点”。值为0.0时不启用,1.0为最强剔除。实测发现:设0.8时,能有效清除背景杂点,但会削薄凸起结构(如齿轮齿顶);设0.3时,杂点残留但齿形完整。我的折中方案是0.5,并配合--min_model_size(最小模型尺寸)过滤掉小于0.5mm³的孤立噪点。

  • --remove_spikes(去除尖刺)
    开启后自动删除长宽比>10的细长三角面。必须开启!某次重建雕塑手掌,未开启此参数,指尖生成大量细长面片,在Unity中引发严重Z-fighting闪烁。开启后,模型面片数减少12%,但渲染稳定性提升100%。

4. 实操全流程演示:以“青铜爵酒器”数字化为例

4.1 项目需求与硬件准备

目标:为某博物馆馆藏西周青铜爵(高25cm,含三足)生成0.2mm精度的全彩网格模型,用于线上展览和3D打印复制品。
硬件:Nikon D850(45MP),24mm定焦镜头,环形LED灯(色温5500K),电动转台(精度0.1°),标定板(A3尺寸棋盘格)。

注意:青铜器表面有氧化铜绿和局部镜面反光,这是MVS最大挑战。必须放弃“单次拍摄”,采用多光谱分组拍摄:

  • 组1:正面柔光(消除反光)
  • 组2:侧光45°(凸显纹饰)
  • 组3:偏振光(抑制镜面反射)
    每组拍摄72张(5°间隔),共216张图。这不是冗余,而是为MVS提供不同光照下的“一致性投票”。

4.2 分步配置与执行命令

步骤1:相机标定与图像预处理

# 标定相机(使用OpenCV) python calibrate.py --pattern chessboard --size 9x6 --square 40 --images ./calib/*.jpg # 预处理:校正畸变 + 伽马校正(青铜器平均亮度82,伽马=0.87) colmap image_undistorter \ --image_path ./raw_images \ --output_path ./undistorted \ --max_image_size 4000 \ --gamma_correction 0.87 \ --camera_model OPENCV

步骤2:SfM稀疏重建

# 创建数据库 colmap database_creator --database_path ./project.db # 特征提取(增强青铜纹饰特征) colmap feature_extractor \ --database_path ./project.db \ --image_path ./undistorted/images \ --ImageReader.single_camera 1 \ --SiftExtraction.num_octaves 4 \ --SiftExtraction.first_octave -1 # 启用亚像素特征 # 特征匹配与位姿解算 colmap exhaustive_matcher \ --database_path ./project.db \ --SiftMatching.guided_matching 1 colmap mapper \ --database_path ./project.db \ --image_path ./undistorted/images \ --export_path ./sparse \ --Mapper.min_num_matches 15 \ --Mapper.init_min_tri_angle 30 \ --Mapper.abs_pose_opt_max_error 2.0

实操心得:--SiftExtraction.first_octave -1是关键!它让SIFT算法从比原图更粗的尺度开始检测,对青铜器上细微的饕餮纹效果提升显著。未启用时,特征点集中在锈斑区域,纹饰区几乎无点。

步骤3:MVS稠密重建(OpenMVS配置核心)

# 导出COLMAP模型供OpenMVS读取 colmap model_converter \ --input_path ./sparse/0 \ --output_path ./openmvs_scene.mvs \ --output_type BINARY # OpenMVS稠密匹配(重点参数解析) OpenMVS/ReconstructMesh \ --input_file ./openmvs_scene.mvs \ --output_file ./dense.mvs \ --max_photo_num 10 \ # 青铜器反光强,需更多视角交叉验证 --min_consistent_photo_num 4 \ # 平衡精度与完整性 --window_radius 4 \ # 4000px图像,按公式计算 --sigma 0.25 \ # 抑制反光干扰 --min_patch_distance 0.0001 \ # 0.1mm精度要求 --working_dir ./workspace

步骤4:网格生成与后处理

# 生成网格 OpenMVS/RefineMesh \ --input_file ./dense.mvs \ --output_file ./refined.mvs \ --max_point_dist 0.0002 \ # 0.2mm精度 --space_carving 0.5 \ --remove_spikes 1 # 导出OBJ(带纹理) OpenMVS/TextureMesh \ --input_file ./refined.mvs \ --output_file ./final.obj \ --decimation 0.8 \ # 减面30%,平衡精度与文件大小 --outlier_removal 2

步骤5:精度验证
用三坐标测量机(CMM)实测爵身三个特征点(流口、鋬手、足尖),与模型对应点距离误差:

  • 流口:0.12mm
  • 鋬手:0.18mm
  • 足尖:0.21mm
    全部优于0.2mm目标。其中足尖误差略高,原因是拍摄时转台轻微晃动,后续在SfM中增加了--Mapper.ba_refine_focal_length 0(固定焦距)约束,误差降至0.15mm。

5. 常见问题与排查技巧实录:那些文档里不会写的血泪教训

5.1 典型问题速查表

现象可能原因排查步骤解决方案
重建后模型大面积缺失SfM位姿解算失败检查./sparse/0/cameras.bin是否存在;运行colmap model_analyzer --path ./sparse/0看图像注册率增加控制点;降低--min_match_score;检查标定板是否被遮挡
模型表面布满噪点(飞点)MVS一致性阈值过低查看./workspace/depthmaps/中深度图,观察噪点分布是否随机提高--min_consistent_photo_num;开启--space_carving
边缘模糊、细节丢失匹配窗口过大或--sigma过高对比不同--window_radius生成的深度图边缘锐度按公式重算--window_radius;对反光材质降低--sigma
计算中途崩溃(内存溢出)图像分辨率超限监控htop看内存占用峰值;检查--max_photo_num是否设得过大缩小--resize_factor;降低--max_photo_num;升级RAM
纹理映射错位(脸贴到手上)相机位姿误差大检查./sparse/0/images.bin中各图像的qvec/tvec是否合理重新标定相机;在SfM中启用--Mapper.ba_refine_extra_params 1

5.2 独家避坑技巧

  • “黑边陷阱”:MVS重建后模型边缘常有一圈黑色,这不是bug,而是深度图外推所致。解决方案不是修图,而是在预处理时用--crop_margin 50(裁剪边缘50像素),因为图像边缘畸变最大,MVS在此处计算极易出错。我所有项目默认加此参数。

  • “玻璃幻影”:拍摄带玻璃罩的文物时,MVS会把玻璃表面反射当成真实表面。传统方案是换偏振镜,但成本高。我的土办法:用两盏灯,一盏主光+一盏背光,拍摄时关闭背光灯,仅用主光;重建完成后,用背光灯单独拍摄一张“环境图”,在后期用Photoshop的“颜色减淡”模式叠加到纹理上,既保留玻璃通透感,又避免MVS误判。

  • “时间换精度”悖论:很多人认为增加拍摄照片数一定能提升精度。实测证明:超过120张后,精度提升趋近于0,但计算时间呈指数增长。我的临界点公式:最优张数 = 360° / (2 × 目标角度精度)。例如,要保证0.5°视角精度,360/(2×0.5)=360张,显然不现实。因此,我坚持“少而精”:用电动转台确保每张图角度精准,总张数控制在72~108张。

  • “参数移植”风险:在A物体上调试成功的参数,直接用于B物体大概率失败。我建立了一个参数日志表,记录每次重建的物体材质、尺寸范围、图像分辨率、--window_radius、--sigma、最终精度。例如,发现“哑光石膏像(30cm)”的最优--sigma是0.72,“抛光不锈钢(20cm)”是0.18——这种经验数据比任何理论都管用。

5.3 性能优化实战:如何让MVS快3倍而不降精度

  • GPU加速陷阱:OpenMVS的GPU版(CUDA)并非总是更快。实测:在RTX 3090上,处理4000×3000图像时,GPU版比CPU版慢1.8倍。原因是GPU显存带宽成为瓶颈。我的方案:用--gpu_index -1强制CPU计算,同时开启--num_threads 16(16核CPU全负载),速度提升220%。

  • 磁盘IO优化:MVS过程产生海量临时文件(深度图、法线图),频繁读写SSD会拖慢整体速度。解决方案:创建RAM Disk(内存盘),在Linux下用mount -t tmpfs -o size=32g tmpfs /mnt/ramdisk,将--working_dir指向此处,I/O延迟从12ms降至0.03ms,重建时间缩短37%。

  • 分块重建策略:对超大场景(如整栋古建筑),不一次性重建,而是用--region_min/--region_max参数分区域处理。例如,将建筑分为“屋顶”、“墙面”、“门窗”三块,分别配置参数(屋顶用大--window_radius抗风噪,门窗用小--window_radius保细节),最后用MeshLab的Close Holes和Merge功能拼接。效率提升2.1倍,且避免单次失败全盘重来。

6. 参数配置的终极心法:从“调参”到“懂物”

干了这么多年MVS,我越来越确信:最好的参数不是数学最优解,而是对被摄物体物理特性的尊重。青铜爵的氧化层是漫反射与镜面反射的混合体,所以--sigma不能取极端值,而要在0.2~0.3间浮动;古建筑的砖缝是亚毫米级凹陷,--window_radius必须小到能捕捉这种尺度;甚至拍摄时的空气湿度都会影响——湿度>70%时,青铜器表面凝结微水膜,会改变反射特性,此时需临时降低--sigma值。

因此,我现在的流程是:拿到物体先花10分钟观察——摸材质、测反光、估尺寸、找特征。然后打开计算器,按公式算出基础参数,再根据观察微调。那个括号里的“(—)”,现在看更像是一个顿悟符号:MVS的终点不是参数列表,而是你站在物体前,一眼就能判断出它需要怎样的光、怎样的视角、怎样的算法权重。参数只是你与物体对话的语言,而真正的老师,永远是物体本身。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 12:53:42

台达HMI编程软件安装联机避坑:DIAScreen/DOPSoft选型与验证

简介&#xff1a;面向使用台达人机界面&#xff08;HMI&#xff09;的电气工程师、设备调试人员与自动化学习者&#xff0c;这份压缩包提供台达触摸屏编程软件的早期安装程序及配套说明&#xff0c;便于了解 DOPSoft 1.00.01 BETA 的界面与基础编程环境。包内共3个文件&#xf…

作者头像 李华
网站建设 2026/11/4 12:52:07

从VSS到Git:版本控制工具迁移与优化实践

1. 版本控制工具演进背景版本控制系统&#xff08;Version Control System&#xff09;作为软件开发的基础设施&#xff0c;经历了从本地化到集中式再到分布式的发展历程。Visual SourceSafe&#xff08;VSS&#xff09;2005作为微软早期推出的集中式版本控制系统&#xff0c;曾…

作者头像 李华
网站建设 2026/11/4 12:49:51

中文用户LoRA训练前置指南:SD标签生成工作流

1. 这不是翻译工具&#xff0c;而是一套“标签生成工作流”——专为中文母语者设计的LoRA训练前置系统你打开Stable Diffusion WebUI&#xff0c;点开Dreambooth或Kohya SS训练界面&#xff0c;看到那一整页密密麻麻的英文输入框&#xff1a;caption file template、prompt sty…

作者头像 李华
网站建设 2026/11/4 12:49:23

小公司产品经理如何平衡售后与产品设计

1. 产品经理为何沦为"售后"&#xff1a;小公司里的角色困境 作为一名在小公司摸爬滚打多年的产品经理&#xff0c;我深刻理解这种"既要当爹又要当妈"的处境。没有标准化的岗位分工&#xff0c;没有完善的售后体系&#xff0c;用户遇到问题第一个想到的就是…

作者头像 李华
网站建设 2026/11/4 12:48:32

风储联合调频系统:新能源电力系统的频率稳定解决方案

1. 项目背景与核心价值 在新能源占比不断提升的电力系统中&#xff0c;频率稳定问题日益突出。传统火电机组调频响应慢、调节精度有限的问题&#xff0c;在风电大规模并网后变得更加尖锐。去年参与某省级电网的调频辅助服务市场设计时&#xff0c;我们团队就遇到过这样的困境—…

作者头像 李华
网站建设 2026/11/4 12:47:19

对抗认知碎片化:构建个人知识体系的四步实践法

1. 项目概述&#xff1a;当算法切割知识时&#xff0c;我们如何重建深度认知 上周整理书架时&#xff0c;突然发现过去三年标记过的电子书笔记分散在7个不同平台&#xff0c;而每天刷到的所谓"知识干货"有83%在三天后完全想不起内容。这让我意识到&#xff1a;在算法…

作者头像 李华