我用 C# 做了个拍照测量小工具:贴一张标记,量长度和面积

最近继续折腾一些能在电脑上直接用的小工具,这次做的是:桌面拍照测量助手。

做手工时,想记录纸样的几个尺寸;整理平面素材时,想把照片、标注和面积结果放在一起。这些场景让我想到,可以把"照片里的参照物"利用起来。

于是,就有了这款小软件。

把已知尺寸的标记和待测对象放在同一平面,拍照、导入电脑,再用鼠标点选,就可以估算长度和面积。

这句话里的"已知尺寸"和"同一平面",是整个工具成立的前提。先记住这两点,后面使用就很容易理解。

桌面拍照测量助手界面

软件界面。图中使用的是程序生成的透视示例,便于演示操作,不是实拍测量效果。

先把一张照片,变成可以记录尺寸的图

目前这个 r1 版本,已经把基本流程串起来了:

  • 导入手机照片,自动处理 EXIF 方向。
  • 识别 AprilTag 标记,建立照片与毫米坐标的对应关系。
  • 点两个位置,测量长度;沿边界点选多个位置,估算面积。
  • 切换原图、透视校正视图,缩放、移动后继续选点。
  • 给标注改名、删除重做,保存工程,下次接着处理。
  • 导出标注 PNG、CSV 数据和 PDF 报告。

可以把它用在纸样、卡片、平面标签、手工纸板等日常估测和记录场景。选择一个与对象贴平、尺寸已知的参照物,是使用的起点。

软件在本机用 CPU 工作,不用下载模型,也不需要独立显卡。这次采用的是视觉标记识别与几何计算,整个运行流程都在本地完成。

第一步:打印一张尺寸可靠的标记卡

软件里有"标记 PDF"和"打印标记"两个入口,运行包也附带一张默认 50 mm、ID 0 的标记卡。

软件生成的标记卡页面预览

这里只是标记卡的页面预览图。实际使用请打印软件导出的 PDF 或包内 PDF,不要直接打印文章截图。

打印时选择 100% 实际大小,关闭"适合页面"等缩放选项。

卡片下面有一条 100 mm 校验线。打印后先用尺子核对它,再量标记的实际黑色外框边长,并把这个数值填进软件。

白色留边不计入边长。 如果打印出来的黑框不是 50 mm,就以实际量到的尺寸为准。

这一步很朴素,却直接决定后面的尺寸换算是否有可靠依据。

第二步:贴平、拍清楚,再导入电脑

把标记卡和被测对象放在同一平面。标记别翘起来,纸板也尽量铺平。

拍摄时尽量正对、拍近一些,让标记清晰可见;避开强烈反光和手机超广角的画面边缘。原图越清楚,后面选点也越方便。

首版使用方式是:先用手机等设备拍照,再把照片导入桌面软件。当前没有接摄像头实时采集。

导入后填写实际标记边长,点击"识别标记"。本版使用 tag36h11 标记;有多个识别结果时,可以选择其中一个,输入的尺寸要对应这个标记。

如果手边有已知边长的真实正方形,也可以使用"手选四角",按左上、右上、右下、左下依次点选它的四角。这里需要的是尺寸已知的正方形参照。

第三步:鼠标点选,留下长度和面积记录

完成标定,勾选"已确认标记与被测对象同平面",就可以开始。

测长度: 在工具下拉框选择"测量长度",点起点、点终点,右侧表格就会增加一条毫米结果。

测面积: 选择"测量面积",沿边界依次点选至少三个点,右键或点击"完成面积"结束,结果单位为平方毫米。

边界不要交叉。点错了可以撤回未完成选点,已经生成的标注可以删除重做;表格里的名称也能修改,便于区分"纸样长边""开口宽度"等项目。

滚轮用于缩放,中键拖动图像。细小位置可以放大后再选,不必一直盯着整张缩略图操作。

倾斜的照片,怎样换算成毫米?

照片里的远近位置,像素与实际长度的比例可能不同。要处理倾斜拍摄,就需要建立整个平面的坐标对应关系。

AprilTag 能提供标记的编号与角点。我们知道真实标记是一个边长确定的正方形,便可以用这四个角点,求出照片平面到毫米平面的透视变换,也叫单应性变换。

在本软件中,可以把流程理解为:

照片像素坐标 → 平面毫米坐标 → 计算线段长度或多边形面积。

勾选"校正视图"后,还能看到平面展开的效果。在校正视图上选点,软件会换算回原图坐标保存,切换视图后可以继续处理同一组标注。

透视合成测试原图

同一张测试图的平面校正结果

两张图均来自同一组合成测试。矩形的已知尺寸为 80 × 40 mm,用于核对几何流程。

AprilTag 的开源实现是一个依赖较少的 C 核心库,本项目将它编译为 Windows 原生 DLL,再由 C# 调用。上游项目:AprilRobotics/apriltag(github.com/AprilRoboti...

我们采用的是同平面坐标换算,当前没有加入相机内参标定或镜头畸变校正。因此,透视校正完成后,拍摄条件和镜头误差仍然会影响结果。

结果可以带走,工程也可以继续编辑

做完测量,可以根据需要选择输出:

输出 适合什么用途
PNG 保存当前原图或校正视图及标注,直观看结果
CSV 保留数值,继续统计或整理
PDF 把照片、标注序号和结果表放进一份报告
测量工程 保留照片、标定和选点,下次继续编辑

软件导出的测量报告预览

PDF 里的照片是位图,标注线条、编号和文字采用矢量路径与字形轮廓,放大仍清晰;文字轮廓不能像普通 PDF 文本一样搜索和复制。

PDF 输出由程序独立生成,不依赖虚拟 PDF 打印机。实体打印机的标记卡打印则使用 WinForms 的 PrintDocument。

工程文件把工作照片也保存进去,复制一个 .pmproj 文件,就能转移到另一台电脑继续处理,不需要再找原照片所在的文件夹。

默认工作区在 EXE 目录下的 workspace,路径以程序目录为基准。换个目录解压,仍然按这套规则使用。

分享一下这一版的验证情况

开发时,我用程序生成了带透视变化的标记和矩形,并保留独立计算的参考角点。自动检测标记后,结合矩形已知角点做换算,得到下面这组结果:

验证项目 已知值 程序换算结果
矩形一条边 80 mm 约 80.05 mm
矩形面积 3200 mm² 约 3201.79 mm²

这是合成图、已知角点条件下的程序验证,不代表手机实拍精度;实际鼠标选点还会引入误差。 当前还没有完成真实物体与量具对照的实拍基准,也没有做实体打印机实测。

工程保存与重开、旋转图片识别、取消处理、原图与校正图选点等流程已经做过检查。源码包也在新的中文目录中重新编译,并验证了解压后的程序从其他工作目录启动。

使用时请把它定位为日常同平面估测工具。它不能测离平面高度和弯曲表面的真实面积;打印缩放、纸张翘曲、角点与选点误差、镜头畸变都会影响结果。显示两位小数,也不意味着达到 0.01 mm 精度。

给喜欢 C# 桌面开发的朋友

这次仍然提供完整 VS2022 解决方案:

  • C# WinForms,.NET Framework 4.8。
  • 窗体采用 .Designer.cs 与 .resx,界面使用标准控件。
  • AprilTag C 核心加小型 C ABI 桥接,C# 负责图片、交互、几何计算和导出。
  • 无需联网 NuGet 还原,所需共享源码已放入当前项目。

源码编译需要 VS2022 的 .NET 桌面开发、C++ 桌面开发、.NET Framework 4.8 Targeting Pack、v143 工具集和 Windows SDK。

r1 的运行 ZIP 约 1.04 MiB ,完整源码 ZIP 约 2.19 MiB。运行包没有包含 .NET 安装器,需要电脑已安装 .NET Framework 4.8;普通运行不需要安装 Python、OpenCV 或 Visual Studio。

这里面有不少适合一起学习的桌面开发细节:照片方向处理、画面坐标换算、透视几何、可携带的工程文件、PDF 与打印,以及设计期和运行期的隔离。

我挺喜欢这类项目:从一个具体的小需求出发,把算法、交互和文件输出串起来,最后变成一个能打开、能操作、能留下结果的工具。

感兴趣的朋友,欢迎进群交流软件使用、C# 开发和开源项目落地经验,也欢迎分享你的使用体验。

QQ 交流群:天天代码码天天

群号码:264292622

相关推荐
聪明蛋子哟1 小时前
高扩展性AI应用架构指南:融合RAG检索、Agent编排与OpenAPI/RPC工具网关的设计模式
人工智能·rpc·架构
一水鉴天1 小时前
决策树、三支决策与随机森林:从精确值到能所双亡双活 20261030(元宝)
人工智能·机器学习
志尊宝2 小时前
AI原生前端开发(023):端侧AI多模态应用开发
人工智能·ai-native
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】ChatServer接口测试
网络·c++·人工智能·学习·ai·大模型·sdk
linktokenview2 小时前
文生图与图生视频大模型对比
人工智能
雨晨源码(同名B站)2 小时前
深度学习毕业设计选题推荐:基于YOLO11的交通标志检测系统设计与实现(Python+Django+Vue3+对接deepseek)
人工智能·python·深度学习·机器学习·django·课程设计
vjmap2 小时前
AI 地图动画-以真实地图为画布的 AI 视频编辑器-唯杰 AI 地图动画正式上线
人工智能·编辑器·音视频·gis·cad
海盗12342 小时前
微软技术日报 2026-11-01:语言模型 API 免申请、8 个威胁组织被分四档
人工智能·microsoft·语言模型·机器人·人工智能aigc