这是高点视频定位的技术主文。如果你只想先判断“这个坐标能不能信”,可以先读《高点视频 AI 识别后,目标坐标为什么不能直接信》。
AI 框给出的是像素坐标,把它换成经纬度要经过一条“相机标定 + 射线投影 + 地面高程”的链路。
这个问题从哪里来
高点相机的画面里,AI 把目标框出来了,框的中心像素也有了。客户说:把这个像素对应的经纬度实时吐出来,下游就能派单。看起来很顺的一条链路。
当时真正难的地方
难点在于像素到地理坐标之间,隔着一条射线。相机视场内同一条射线上,等距的不同地面点会映射到同一个像素。如果不做高程假设,像素根本对应不到唯一的地面点。
- 相机标定:畸变和内参是否可靠,直接影响框中心像素。
- 相机位姿:云台的方位、俯仰、焦距在线上是否被实时读取到。
- 地面假设:默认平地面还是引入 DEM,决定误差是米级还是十米级。
- 时间同步:视频帧和姿态数据必须对齐,否则差一帧就是几十米。
换成真实项目,最耗时间的不是公式
这套链路在真实项目里真正耗时的,是把"第三方字段到底怎么理解"一一对齐。公式只占一小截,口径才是大头。
- 高程口径:一度把
cameraHeight=300当成离地高度,目标 400 米却算成了 3.8 公里——它其实是海拔。真实离地高度改由监测点字段现场维护,量级才拉回正常。 - 俯仰角口径:设备返回的垂直角是"自水平向下"还是"相对正下方(天底角)",公式会从
H/tan(θ)变成H·tan(θ),结果差到 10 倍以上;不同设备符号还不一致,内部要统一取绝对值、保留原始值供联调。 - 变倍两种格式:有的给实际倍率
zoomValue=1.0,有的给归一化值zoom=0.03125,后者当倍率直接用,视场角会被放大 32 倍。要按数值范围自动识别并换算,再在视场角上下限之间夹取兜底。 - 单位与缺省:第三方字段可能带单位(
"59°"),也要定一套参数缺省时的补全优先级,避免算到一半缺一个数;每个接口要有结果状态码(calc_status),而不是只回一个坐标。 - 成功判据:第三方用
status=0表示成功,我们内部却约定SUCCESS=1。改成以返回体里业务字段是否非空来判断,才不会被状态码约定带偏。
就算摄影测量全套做对,还有一堆"口径"在等你:高程基准、角度零位、倍率格式、单位、状态码。把一个输入的口径、符号、单位、缺省规则定死,这个功能才算告一段落。
我的判断
这个需求一定要在方案里拆成两段讲:识别是可交付的,定位要单独谈精度。先拿一版"平地表假设"快速验证流程,再按精度要求决定要不要上 DEM。
bbox center -> camera ray -> ground intersection -> lng/lat + confidence
可复用经验
- 把像素坐标、相机内参、相机位姿、地面高程四个输入显式建模,缺一个就标注“降级”。
- 云台位姿要设计成可实时读取,而不是靠首帧标定死值。
- 每条目标加一个误差半径或置信标记,让下游知道该坐标能不能直接用来命令作业。
- 定位结果和识别结果分开落库、分开展示,避免“识别可信”被误当成“坐标可信”。
留给下次
现在这套在平地和缓坡区域表现稳定。下一步想引入所在站点的局部 DEM,并把射线投影的误差带画进地图图层里,给业务侧一个直观的“能信多少”的提示。