写了个相机 RAW 照片 GPS 轨迹对齐、智能插值与离线反地理编码工具 Photools

15 小时 4 分钟前
 vincentchyu

[开源] 写了个相机 RAW 照片 GPS 轨迹对齐、智能插值与离线中文地名归档工具 photools

各位 V 友好。

平时喜欢带着相机到处跑,同时也是个写 Go 的程序员。每次外拍或者旅行回来,把几千张 RAW 照片导进电脑整理时,总会被照片的地理信息折磨:

  1. 相机时钟偏差:相机没内置 GPS ,用手机或佳明手表录了 GPX 轨迹,但相机时间和 GPS 总会差个几秒或几分钟,手动对齐繁琐,跨时区更是灾难;
  2. 室内/盲区断点:进了室内、隧道或者短暂停留时,手机没打上点,导致同一机位拍的照片一部分有坐标、一部分完全空白;
  3. 地名逆地理体验糟糕:Lightroom 之类的工具要么依赖联网,要么反查出来的中文地名不规范,更别提自动打上「某某风景名胜区 / 5A 景区」的 POI 了;
  4. 传统脚本慢如蜗牛:以前自己写 Python 调 ExifTool 批处理,每张照片都 fork/exec 一次子进程,上万张 RAW 照片能让风扇狂转半小时;
  5. 双格式同步容易漏:RAW + JPG 同拍或者带调色 XMP 时,元数据经常不同步。

折腾了一段时间,自己用 Go 撸了一套专门解决照片导入电脑后“第一公里”的元数据处理工具:photools。目前已经在 GitHub 开源。


做了哪些事情?

整个处理链路设计成了分阶段屏障流水线( Stage Barriers Pipeline ):

[待处理照片 RAW/JPG] ──▶ 1. GPX 轨迹匹配 ──▶ 2. GPS 智能插值 ──▶ 3. 离线逆地理 ──▶ 4. 拍摄日期归档 ──▶ [归档库/YYYY/MMDD/]

1. GPX 轨迹精准匹配与秒级偏差补偿

2. 室内与断点自愈( GPS 智能时间插值)

很多时候在景区室内或峡谷拍的照片没命中 GPX 轨迹:

3. 纯离线 3D KD-Tree 高精逆地理(全国 90 万+ POI )

4. 真实拍摄日期原子归档


一些工程与性能实现

为了让批量处理几十万张 RAW 时不卡顿,做了一些底层优化:

1. ExifTool Stay-Open 守护进程池(速度提升 ~20 倍)

传统脚本慢是因为频繁启动 Perl 进程(单次 30~50ms )。photools 实现了基于管道通信的 StayOpenPool 常驻守护池(exiftool -stay_open True -@ -),单次读取开销压到了 1~2ms,并且支持子进程崩溃自愈。

2. 3D KD-Tree 空间索引 + O(log K) 时间分桶

3. Go ➔ SwiftUI 进程内 C-Shared FFI 直通

macOS 客户端用原生 SwiftUI 写的,没有在本地开 HTTP 服务或搞 RPC ,而是把 Go 核心编译成了 libphotools.dylib 动态库,SwiftUI 通过 C-Shared FFI 在进程内直接调用,延迟在 0.1ms 左右。


界面展示

1. 工作区引导与离线 3D KD-Tree 反查

2. 多阶段流水线执行过程全景

3. 执行审计看板与待处理诊断清单

4. 终端 TUI 工作台(基于 Bubble Tea )

习惯在终端或 Linux/NAS 跑的同学,也可以直接敲 ./photools tui 启动交互式终端界面:


写在最后

项目完全开源,没有商业化诉求,主要是为了解决自己和身边摄影朋友的实际整理痛点。

如果你也是相机常客、对照片元数据/GPS 轨迹有强迫症,欢迎试用、提 Issue 或 PR !

484 次点击
所在节点    分享创造
4 条回复
bearbest
14 小时 26 分钟前
之前确实有类似的困扰,试用一下。
另外问一下 GPS 运动轨迹记录 OP 用的什么软件或设备?
vincentchyu
13 小时 9 分钟前
@bearbest 我是用 workoutdoors ,还有苹果健康,上传 strava ,两步路组合使用,还没有找到不依赖手机的 gps 记录设备
zzzain46
12 小时 51 分钟前
@vincentchyu #2 这个跟 GPX Tracker 有什么功能差异吗
vincentchyu
9 小时 38 分钟前
@zzzain46 这个是清洗摄影档案的,不是记录的你说的那个应该是记录吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1237284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX