在地形中匹配路径

时间:2017-05-17 16:58:21

标签: algorithm image-processing geometry gis

我需要将lidar(x / y / height)记录的路径匹配到地图图块(像素高度字段)

我可以假设问题是2.5D(即每个点的唯一高度,没有洞穴),并且该区域足够小以使网格均匀(不需要考虑曲率)。当然,赛道数据很嘈杂,而且我事先没有任何已知的位置。

不是基于完整的基于3D点的迭代最近点是否有任何简单的表面路径匹配算法我应该看看?

具体来说,它似乎是一个图像处理问题(x,y,高度=强度)所以某种蛇匹配算法?

2 个答案:

答案 0 :(得分:0)

不是强力(计算每个起点的完整路径的误差),而是只能扩展最佳点并可能节省大量工作。

  1. 规格化:

    • 从路径中的所有点减去(pathMinX,pathMinY)。
    • 从网格中的所有点减去(gridMinX,gridMinY)。
  2. 查找pathMaxX,pathMaxY,gridMaxX,gridMaxY。

  3. deltaMaxX = gridMaxX - pathMaxX,deltaMaxY = gridMaxY - pathMaxY。

  4. 为deltaX和deltaY的所有组合创建一个包含(deltaMaxX + 1)*(deltaMaxY + 1)节点的数组或列表。每个节点都必须包含以下信息:

    • index,初始化为0
    • deltaX和deltaY,使用循环计数器进行初始化
    • 错误,初始化为(path [0] .height - grid [path [0] .x + deltaX] [path [0] .y + deltaY] .height)^ 2
  5. 按错误排序数组。

  6. 当arr [0] .error< = arr [1] .error:

    • ARR [0]的.index ++
    • if arr [0] .index == n:return(arr [0] .deltaX,arr [0] .deltaY)
    • arr [0] .error + =(path [arr [0] .index] .height - grid [path [arr [0] .index] .x + arr [0] .deltaX] [path [arr [ 0] .index] .y + arr [0] .deltaY] .height)^ 2
  7. 删除节点0并将其插入正确的位置,以便数组再次排序。

  8. 重复步骤6.和7.直到找到解决方案。

  9. 如果你首先将路径中的点按极端高度排序(首先是最低点和最高点,然后朝着网格的平均高度移动,例如,你应该(我认为值得)你可以进一步改进算法,例如按abs(height - averageGridHeight)降序排序。像这样大的错误是早期产生的,因此分支可以提前减少。

答案 1 :(得分:0)

纯粹是理论上的,但是如果你将3D数据编码为灰度图像(3D路径作为灰度图像,高度图已经可能就是这样,只需要确保尺度有意义)。

如果您将3D路径作为灰度图像并将高度图作为灰度图像,那么您可以使用计算机视觉技术在干草堆搜索中进行搜索。例如,在OpenCV中,有一些技术可以在更大的图像中查找子图像:

  1. Template Matching - (过度简化)使用滑动窗口进行像素比较
  2. Chamfer Matching - 更多地使用边缘 - 可能更适合您的目标。记得我ran into an allocation bug上次使用它:它最终会起作用,但需要一点爱(做malloc修复并跟踪读取误报的成本)但是有一些选项可以处理比例差异
  3. 模板匹配示例: template matching template matching python api

    倒角匹配示例: chamfer matching