手机视频一键生成建筑平面图:从三维重建到CAD出图的技术链路 把手机绕房间拍一圈几分钟后拿到一张可以交到设计院审图的建筑平面图——这个需求如果在十年前提出来大概率会被当成一句玩笑。手机视频本身是二维画面流建筑图纸是带尺寸、带图层、带规范的工程文档二者之间隔着的不是一种文件格式而是从“看见房间”到“理解建筑”的整个认知过程。HomeCat 在 Hacker News 上展示的正是这个方向的产品化尝试输入一段手机视频输出 permit-ready 的建筑图纸。如果只看演示很多人会把它归类为“又一个三维扫描工具”。真正值得关注的点在于它把一个通常需要三维扫描仪、CAD 绘图员和现场测量员共同完成的流程压缩成了一个视频采集任务。这个变化发生在测量链路的入口而不是软件操作层面。也就是说过去最耗时、最让人头疼的“现场记录 手动画底图”环节很可能被自动化为一次环绕拍摄。这篇文章会帮你搞清楚几件事HomeCat 尝试解决的问题到底难在哪里一段手机视频要变成可送审的图纸中间必须经过哪些技术环节如果你想用开源工具自己搭一个类似的验证流程应该从哪一步开始以及为什么这类工具在真实项目中仍然有精度和责任边界。1. 这篇篇文章真正要解决的问题建筑行业的数字化程度低并不是因为从业者不拥抱新技术而是因为“测量—绘图—审图”这条链路太长每个环节都依赖不同的工具和人。拿一套普通住宅的翻新来说流程通常是这样的设计师到现场用激光测距仪或卷尺测量每个房间的长宽高把门窗位置、梁柱位置、墙厚、管道走向用手绘草图记录下来回到办公室用 CAD 软件把草图变成电子版平面图再由设计师或工程师检查尺寸、标注、图层和规范确认没有问题之后才能进入审批或施工环节。整个过程通常要花两三天其中大量时间消耗在测量和“把测量结果变成底图”这两步。如果现场有家具、吊顶遮挡或者遇到户型不规则、层高不一致的情况一次测量往往还不够要反复跑现场。HomeCat 这类工具想解决的就是这个“入口成本”问题。它把现场测量和底图绘制两个步骤合并成一个“拍视频”的动作。用户不需要掌握 CAD 操作不需要知道什么是图层和线型只需要有一个手机绕着房间拍一段覆盖完整的视频就能得到一份可以继续编辑、可以送审的图纸。这个判断很重要它并没有试图把建筑师或设计师变成可选项而是把现场记录和底图绘制这个最耗时、最容易出错的环节自动化。图纸后续的语义检查、结构标注、规范核对仍然需要专业工程师来完成。从开发者视角看这个项目值得研究和拆解的点也很多。它不是一个简单的图像分类模型而是摄影测量、计算机视觉、点云处理、CAD 生成等多个技术栈的组合。即使你不在建筑行业它的技术链路对做三维视觉、机器人感知、空间建模的开发者也有参考价值。读完这篇文章你会对“视频转图纸”的完整技术实现有一个具体认知并能够用开源工具复现一条最小可运行的验证链路。2. 什么是 HomeCat它改变的是测量链路而不是画图方式从项目标题看HomeCat 是一个典型的 Show HN 项目也就是个人开发者或小团队在 Hacker News 上展示自己的作品。名字由 Home 和 Cat 组合而成虽然官方没有给出完整的产品说明但可以合理推断它与“家庭空间”“建筑图纸”密切相关。本文不讨论它的源码细节而是聚焦它背后的技术路径以及这类工具对建筑行业工作流的真实影响。要理解 HomeCat 的价值需要把它放到传统的建筑制图流程里看。传统 CAD 绘图是“人先理解空间再把空间翻译成图纸”。设计师到现场看到一面墙心里会自觉标注出它的起止位置、厚度、材质、是否承重然后在 CAD 里用双线、图块、图层来表达这些信息。这个过程非常依赖人的判断机器很难直接复现。HomeCat 的思路不同它把流程倒过来先用视觉算法从视频中重建出空间几何再通过语义理解把几何信息转换成建筑对象。手机视频提供的不只是画面而是包含相机运动轨迹的多视角观测。通过运动恢复结构可以计算出每一帧图像对应的相机位置再通过多视角立体匹配生成房间的三维点云。到这里为止技术方案与摄影测量领域的成熟思路是一致的。真正的难点在于下一步如何把“一堆点”变成“一面墙”“一扇门”“一个房间”。点云本身没有语义它只是一堆三维坐标和颜色。要从点云中识别出墙、地面、天花板、门窗开口就需要做平面检测、区域分割、对象识别和拓扑推理。这也是 HomeCat 与普通三维扫描 App 的本质区别。普通扫描 App 的输出是 mesh 或点云看起来真实但无法编辑也无法生成带标注的工程图纸。HomeCat 的输出是“图纸”这意味着它必须理解建筑语义哪条线是墙边线哪个缺口是门洞哪段轮廓是窗台哪个区域属于卫生间。一个更准确的说法是HomeCat 做的不是三维重建而是建筑制图自动化。三维重建只是中间步骤它的目标产物是符合 CAD 规范的可编辑图纸。从实用角度看这个工具真正降低的是现场记录和底图绘制的成本。过去一个设计师花两天才能完成的工作现在可能只需要一次完整拍摄和几分钟等待。但代价是用户必须理解它的边界自动生成的图纸只能作为底图和参考最终审批仍然需要具有资质的设计人员签名确认。3. 视频到图纸的核心技术链从像素到墙体尺寸为了让后面的复现流程更清晰这里先把一条完整的技术链路拆开来看。从一个手机视频到一张建筑平面图中间至少要经过六个环节。技术环节输入输出典型实现方式视频采集与抽帧手机拍摄的原始视频一组清晰的图像帧FFmpeg 固定帧率抽帧运动恢复结构多视角图像帧相机位姿与稀疏点云COLMAP、OpenMVG多视角立体匹配图像帧 相机位姿稠密点云或深度图COLMAP PatchMatch点云处理与平面检测稠密点云墙面、地面、天花板平面Open3D RANSAC语义分割与对象识别几何信息 图像纹理门窗、墙体、房间区域深度学习模型如 Mask2Former矢量化和 CAD 生成建筑对象几何DXF/DWG/PDF 格式图纸ezdxf、AutoCAD API这个表里的每一步都有成熟的学术成果和开源工具但当它们串联成一个产品时工程难度会指数级上升。因为每个环节都会累积误差抽帧少了会丢信息模糊帧会导致相机位姿计算失败点云密度低会导致平面检测不稳定平面检测错误又会导致门窗位置判断失误。最终图纸的尺寸误差是所有这些环节误差的叠加。摄影测量与计算机视觉社区已经有很多可以复用的技术比如 SfM 算法中的光束法平差可以同时优化相机位置和三维点坐标MVS 中的 PatchMatch 算法可以在大场景下生成密集点云。最新研究还在尝试用 NeRF、3D Gaussian Splatting 做更高质量的新视角合成和场景重建。但从工程角度看真正把视频变成图纸的最后一步也就是点云到 CAD 图形对象的转换仍然是最难自动化、最缺乏数据标注的环节。这就引出一个关键问题既然普通三维重建已经很成熟为什么依然很少看到自动生成的图可以直接拿去审批答案在于审批图纸不仅要“看起来像”还要满足一整套工程规范。下一节会展开讲。4. 什么叫“可送审”的图纸精度、图层、标注与规范很多开发者在尝试类似项目时会犯一个认知错误以为只要能把墙体轮廓画出来就等于“生成了一张建筑图”。但真正能送审的图纸至少需要满足以下要求完整的建筑语义识别出的每条线都要对应真实建筑对象比如墙轴线、墙边线、门窗洞口、楼梯踏步、排水管位置。它不能是一条孤立的折线。规范的图层组织墙体、门窗、标注、家具、设备通常分属不同图层。审图人员会按图层检查没有图层管理的图纸无法进入正规流程。精确的尺寸标注图纸必须包含房间开间、进深、墙厚、门窗宽度、净高、面积等标注信息且误差要在允许范围内。现场测量误差和自动重建误差的叠加很容易让面积数据失真。符合当地建筑规范不同地区的住宅规范对最小房间面积、走道宽度、通风采光要求不同。AI 生成的图纸如果不符合规范就需要人工调整。责任闭环施工图签字栏需要设计人员、校对人、审核人签字。即使图纸是由算法生成的最终责任主体仍然是人不是软件。这意味着 HomeCat 如果真的把“permit-ready”作为目标它的输出不只是几何图形还必须包含符合制图标准的图纸结构。比如墙体要用双线表示门要用弧线加图块窗要用四条平行线楼梯要用箭头标注方向。这些都是 CAD 制图规范中的基础内容对算法来说每一个都是独立的难题。从项目标题使用的 “permit-ready” 一词可以推断这个项目很可能已经做了不少工程化工作把常用的制图样式和标注规则内置到生成流程中。如果用户拍摄的是标准住宅生成结果可能真的接近可以直接送审但如果是复杂户型、公共建筑或者有结构改造需求的场景自动生成的图纸仍然只是一个高质量的起点需要专业人员继续加工。对开发者来说理解这一点非常重要。当你准备做类似工具时“生成墙体轮廓”和“生成一套可交付图纸”是两个量级完全不同的项目。前者可以靠几个开源库快速跑通后者需要有建筑设计知识、规范理解、图层管理和版本控制机制。5. 用开源工具复现一套类似的视频转图纸流程如果你不想只用 HomeCat而是想理解它的原理甚至做出一个最小可行验证版本下面这套开源工具组合是一个很好的起点。这不是 HomeCat 的官方实现而是一个典型技术链路你可以把它当作理解该项目的“解剖实验”。5.1 环境准备建议使用以下环境Ubuntu 22.04 或 Windows WSL2Python 3.10 及以上版本GPU 可选有 GPU 会明显加快稠密重建FFmpeg用于视频抽帧COLMAP用于运动恢复结构和多视角立体Open3D用于点云处理和平面检测ezdxf用于生成 DXF 图纸。安装命令如下具体版本以你本机为准sudo apt update sudo apt install -y ffmpeg colmap python3-pip pip install open3d ezdxf opencv-python如果你用的是 macOSCOLMAP 可以通过 Homebrew 安装brew install colmap ffmpeg安装完成后先确认所有工具都能正常运行ffmpeg -version colmap -h python3 -c import open3d, ezdxf; print(ok)5.2 拍摄建议与视频抽帧拍摄质量直接决定重建质量。拍摄时尽量做到以下四点手机稳定不要边走边大幅抖动镜头平视墙面避免仰角太大光线充足避免逆光和镜面反射围绕房间走两圈确保每个角落被覆盖到。采集到原始视频后用 FFmpeg 抽帧。这里选择 5 帧每秒是为了在重建质量和数据量之间取一个平衡。帧率过高会生成大量相似图像反而增加特征匹配的负担。mkdir -p frames ffmpeg -i room_video.mp4 -vf fps5 -q:v 2 frames/frame_%05d.jpg抽帧后建议快速浏览一遍 frames 目录删除模糊、曝光异常、被手挡住镜头的帧。这一步很朴素但很重要垃圾帧会在后续重建阶段引发大量错误。5.3 用 COLMAP 重建相机位姿COLMAP 是运动恢复结构领域最常用的开源软件。它分为两个阶段特征提取与匹配、增量式的地图构建。第一步抽取每张图像的特征点并匹配colmap feature_extractor --database_path db.db --image_path frames colmap exhaustive_matcher --database_path db.db第二步执行增量式重建mkdir -p sparse colmap mapper --database_path db.db --image_path frames --output_path sparse重建完成后sparse 目录下会生成一个包含相机位姿和稀疏点云的模型。如果希望用文本格式查看相机个数和点云数量可以执行mkdir -p sparse_txt colmap model_converter --input_path sparse/0 --output_path sparse_txt --output_type TXT这里需要留意sparse/0中的编号。大部分情况下COLMAP 生成的子模型目录是sparse/0但如果重建被拆分成多个子模型你需要选择点云最多、相机数量最多的那个子模型继续。5.4 稠密重建生成点云稀疏点云主要用于估计相机位姿密度不够做平面检测。因此需要用 COLMAP 的多视角立体模块生成稠密点云。mkdir -p dense colmap image_undistorter \ --image_path frames \ --input_path sparse/0 \ --output_path dense \ --output_type COLMAP colmap patch_match_stereo \ --workspace_path dense \ --workspace_format COLMAP \ --PatchMatchStereo.geom_consistency true colmap stereo_fusion \ --workspace_path dense \ --workspace_format COLMAP \ --input_type photometric \ --output_path dense/fused.ply运行完成后dense/fused.ply就是包含房间几何信息的稠密点云。这一步通常耗时几分钟到几十分钟取决于帧数和图像分辨率。如果你的机器没有 GPUpatch_match_stereo阶段会非常慢。这时可以降低输入的图像分辨率或者减少抽帧数量比如改成 3 帧每秒。5.5 用 Open3D 做点云平面检测得到点云后先用 Open3D 做体素降采样再用 RANSAC 平面分割把面积最大的平面提取出来。对于一套标准房间面积最大的平面通常是地面或墙面。import open3d as o3d # 读取稠密点云 pcd o3d.io.read_point_cloud(dense/fused.ply) print(原始点云数量:, len(pcd.points)) # 降采样减少计算量 pcd_down pcd.voxel_down_sample(voxel_size0.01) # 估计法向量平面分割时需要 pcd_down.estimate_normals( search_paramo3d.geometry.KDTreeSearchParamHybrid(radius0.02, max_nn30) ) # RANSAC 平面分割 plane_model, inliers pcd_down.segment_plane( distance_threshold0.01, ransac_n3, num_iterations1000, ) # 提取平面点云并可视化 plane pcd_down.select_by_index(inliers).paint_uniform_color([1, 0, 0]) rest pcd_down.select_by_index(inliers, invertTrue).paint_uniform_color([0.5, 0.5, 0.5]) o3d.visualization.draw_geometries([plane, rest])这段代码的关键在于segment_plane的distance_threshold。它代表点到平面的最大距离单位是米。如果点云是从真实场景重建的0.01 米是一个比较合理的初始值。墙面本身会有一些噪声阈值太小会把真实墙面点误判为离群点。提取到的平面会同时输出plane_model也就是平面方程ax by cz d 0的四个系数。通过法向量方向你可以区分地面、天花板和墙面。这一步是后续生成平面图的基础。5.6 点云投影生成 DXF 图纸得到墙面点云后一个实用的简化做法是把点云投影到水平面上得到俯视轮廓再对这个二维轮廓做边界提取最后用 ezdxf 画成多段线。下面的代码演示了如何根据墙面点云生成一个简化房间外框并保存为 DXF 文件。真实项目里你还需要根据门窗位置打断墙体线、标注尺寸、划分房间这里只演示最小链路。import numpy as np import ezdxf # 假设你已经在 Open3D 中提取出了墙面点云坐标 # 这里使用一个 5m x 3.4m 的房间作为示例 corners [(0, 0), (5000, 0), (5000, 3400), (0, 3400)] doc ezdxf.new(R2010) msp doc.modelspace() # 添加墙体轮廓单位按毫米处理 wall_layer doc.layers.add(WALL, color7) msp.add_lwpolyline(corners, closeTrue, dxfattribs{layer: WALL}) # 添加尺寸标注简化只标注一条边 dim msp.add_linear_dim( base(0, -500), p1(0, 0), p2(5000, 0), dimension_typehorizontal, ) dim.render() doc.saveas(floorplan.dxf)为什么这里把单位按毫米处理因为建筑平面图在国际通行的 CAD 约定里通常使用毫米作为标注单位。你从点云中读取到的三维坐标是米制在写入 DXF 前需要乘以 1000。真实场景下从点云到矢量的过程通常会经过这些步骤把墙面点云投影到 XY 平面对二维点云做网格化再提取轮廓线使用 Alpha Shape 或凹包算法得到多边形边界对边界做 Douglas-Peucker 简化减少折点识别墙洞把门、窗从墙体线中分离出来按图层写入 DXF/DWG。如果你熟悉 Python 地理信息工具也可以尝试用shapely的concave_hull方法提取边界再把 Boundary 写入 DXF。整体思路一致。6. 运行结果与效果验证如何判断生成的图纸可靠复现流程跑完后最关键的问题是结果到底靠不靠谱不能因为点云看起来密集、图纸能够打开就认为精度达标。下面按排查优先级给出验证建议。首先是相机位姿数量验证。打开sparse_txt/images.txt查看它有多少个相机位置。如果你的视频抽出了 100 帧重建后却只有 20 个相机位姿说明大量帧没有被有效匹配重建结果大概率不完整。其次是稠密点云完整性验证。用 Open3D 或 CloudCompare 打开dense/fused.ply观察房间的墙脚线、门窗洞口是否清晰。如果墙脚线呈锯齿状或者大块墙面缺失说明拍摄时角度不够或光线不足。然后是比例尺验证。这是最容易被忽略也最重要的一步。手机视频没有真实尺度信息重建出的模型比例是正确的但你不知道它对应真实世界的多少米。你需要用一把卷尺测量现场某个明显距离比如房间宽度然后在点云里测量两个对应点的距离计算缩放系数。import open3d as o3d import numpy as np pcd o3d.io.read_point_cloud(dense/fused.ply) # 假设你知道现场某面墙的真实长度是 5.0 米 # 在点云中通过可视化工具读取该墙两端的三维坐标 p1 np.array([1.234, 0.567, 1.000]) p2 np.array([1.364, 0.567, 1.000]) point_cloud_length np.linalg.norm(p2 - p1) real_length 5.0 # 现场测量值单位米 scale real_length / point_cloud_length print(缩放系数:, scale) # 之后所有坐标都乘以 scale 再转毫米输出最后是图纸语义验证。把生成的 DXF 文件用 LibreCAD 或任何支持 DXF 的查看器打开对比现场照片重点检查墙体双线的宽度是否符合实际墙厚门、窗位置是否与现场一致房间面积是否与激光测量结果接近是否出现了重叠线、断线、多余折点等几何错误。如果发现问题先不要盲目调算法参数。通常最有效的修正是补拍视频或者修正比例尺其次是调整平面分割阈值。算法层面的微调效果往往不如提高输入数据质量明显。7. 常见问题与排查方法视频转图纸的坑问题现象可能原因排查方式解决方案COLMAP 重建出的相机位姿数量远小于输入帧数画面模糊、重复纹理或帧率过高查看特征点提取日志统计每帧特征点数量放慢拍摄、增加光照、降低抽帧频率稠密点云中墙面有大量空洞拍摄角度单一墙面被家具遮挡在 CloudCompare 中检查点云密度分布多角度补拍绕房间走两圈平面分割提取到的是天花板而非墙面点云密度不均匀最大平面可能是天花板检查plane_model法向量方向根据法向量方向过滤平面或手动指定地面高度图纸面积与现场测量偏差超过 5%缺少比例尺标定或标定不准确对比点云中已知长度与现场实测值放置已知长度的标定物重新计算缩放系数墙体线不连续出现断线点云边界提取阈值太小或噪声过多检查轮廓线折点图增大简化算法容差先平滑点云再提取边界DXF 打开后墙线没有厚度生成的只是单线轮廓不是双线墙体CAD 中查看图层和对象类型在 CAD 中用偏移命令生成双线或改进生成逻辑门窗识别结果混乱门洞在点云中不完整查看点云中的门洞区域点云数量拍摄时重点保证门洞区域包含多个视角这些坑在真实项目中几乎都会遇到。不要指望一条命令就能搞定完整流程。更稳妥的做法是把流程拆成多个阶段每个阶段都做一次可视化检查确认没问题再进入下一阶段。8. 最佳实践与工程建议如果你要基于这套技术栈做一个真正可用的产品或者打算把这类工具引入团队工作流下面几点建议值得收藏。8.1 把拍摄规范产品化工具能自动生成图纸但用户拍摄是否规范直接决定成功率。最简单有效的方式是在 App 里加入引导式拍摄用动画提示用户“请绕房间逆时针走两圈”“请保持手机稳定”“请不要靠近窗户”。拍摄规范一旦产品化后续算法的成功率会大幅提升也减少客服和返工成本。8.2 分房间采集不要一镜到底很多用户习惯从一个房间走到另一个房间希望一次拍完整套房子。但跨房间拍摄会带来拓扑复杂性门洞连接多个空间不同房间的光照差异大重建时容易产生漂移。更稳的做法是每个房间单独拍摄然后靠门洞位置的公共几何把房间拼接起来。虽然增加了用户操作步骤但重建稳定性提升明显。8.3 强制加入比例尺手机视频没有真实世界尺度自动生成的图纸如果无法确定 1 米等于多少个单位就没有工程价值。产品中可以在拍摄前让用户放置一张已知尺寸的 A4 纸或标定板后台通过检测标定物自动计算缩放系数。这一步比任何后处理都有效。8.4 点为云质量设立检查关卡不要把所有点云都交给下游算法。可以设定几个硬指标相机位姿数量、点云覆盖率、点云法向量一致性、参考距离误差。任一项不达标就提示用户重新拍摄或补拍。这个“质量闸门”机制是工程系统与科研脚本的关键区别。8.5 明确责任边界自动生成的图纸不能直接承担审批责任。产品中要有清晰的提示由 AI 生成的图纸只能作为设计底图和测量参考最终送审图纸必须由有资质的设计人员复核、调整、签字。作为开发者也要在用户协议里写明适用范围避免因为用户拿去送审出现问题而引发争议。8.6 建立样本反馈闭环从点云到建筑语义这一步目前最大的瓶颈是缺乏高质量标注数据。建议每个失败案例都保存下来记录拍摄环境、失败阶段、错误特征。积累到一定规模后可以用这些数据微调目标检测或语义分割模型。这类工具的核心壁垒最终会沉淀在“建筑空间语义数据集”上而不是在某个算法技巧上。9. 总结与后续学习方向HomeCat 这类工具给人最大的启发不是一个算法模型改变了建筑行业而是它把测量、绘图、审核这条长链条重新分了组。过去必须依赖人工串联的环节现在被压缩成了一个视频采集入口。这种变化的真正价值不在“AI 画图很神奇”而在“现场记录与底图绘制成本被大幅降低”。从纯技术角度看视频转图纸的关键路径已经比较明确抽帧、运动恢复结构、稠密重建、点云平面检测、语义识别、矢量化和 CAD 输出。每一个环节都有成熟开源工具可用但串联成产品时质量控制和误差修正是最考验工程能力的地方。如果你要深入下去建议优先补这些方向的知识COLMAP 的相机模型与光束法平差、Open3D 的点云分割与几何配准、DXF/DWG 的实体类型与图层规范以及深度学习在建筑语义分割上的最新模型。对普通开发者来说下一步最有价值的实践不是立刻去复现 HomeCat 的完整能力而是先用手机拍一段房间视频跑通 COLMAP 到 Open3D 这条链路亲眼看看点云重建的精度和问题。先在最小数据集上建立直觉再考虑加入平面检测、门窗识别和 CAD 生成。最后提醒一句如果你想做真实项目请务必把“比例尺标定”和“复核签字”这两件事放在第一位。算法可以帮你把视频变成图纸但一张图纸能不能送去审批最终由尺寸精度和工程责任共同决定。