Home >> 热成像与可见光鸟瞰图地理配准实现

热成像与可见光鸟瞰图地理配准实现

2023-04-03 18:29 AtmosphereMao

鸟瞰图地理配准实现

问题

在进行无人机拍摄鸟瞰图时,热成像rcx.tif与可见光ldk.tif所拍出的角度不同,会发生目标无法对应的问题。如图所示。

热成像图:

rcx.tif

可见光图:

ldk.tif

解决方案

思路:通过特征点匹配,采用仿射变换,计算特征点偏移量,实现地理配准

通过采用SIFT特征点检测-Brute-force/FLANN匹配特征点,但由于热成像的特征点并不明显,与可见光匹配性很低,如图所示,无法实现。需要人工手动标注特征点。

sift

通过前端返回的坐标为latlon经纬度。需要进行转化

def lonlat2geo(dataset, lon, lat):
    '''
    将经纬度坐标转为投影坐标(具体的投影坐标系由给定数据确定)
    :param dataset: GDAL地理数据
    :param lon: 地理坐标lon经度
    :param lat: 地理坐标lat纬度
    :return: 经纬度坐标(lon, lat)对应的投影坐标
    '''
    prosrs, geosrs = getSRSPair(dataset)
    ct = osr.CoordinateTransformation(geosrs, prosrs)
    coords = ct.TransformPoint(lon, lat)
    return coords[:2]

转为经纬度后再转为像素坐标

def geo2imagexy(dataset, x, y):
    '''
    根据GDAL的六 参数模型将给定的投影或地理坐标转为影像图上坐标(行列号)
    :param dataset: GDAL地理数据
    :param x: 投影或地理坐标x
    :param y: 投影或地理坐标y
    :return: 影坐标或地理坐标(x, y)对应的影像图上行列号(row, col)
    '''
    trans = dataset.GetGeoTransform()
    a = np.array([[trans[1], trans[2]], [trans[4], trans[5]]])
    b = np.array([x - trans[0], y - trans[3]])
    return np.linalg.solve(a, b)  # 使用numpy的linalg.solve进行二元一次方程的求解

最后通过cv2.warpPerspective实现仿射变换

src1_warp = cv2.warpPerspective(src1_orig, M, (cols, rows), cv2.WARP_INVERSE_MAP)
src2_warp = cv2.warpPerspective(src2_orig, M, (cols, rows), cv2.WARP_INVERSE_MAP)
src3_warp = cv2.warpPerspective(src3_orig, M, (cols, rows), cv2.WARP_INVERSE_MAP)

注意:插值算法需要采用反变换标志

偏移量计算方法采用gdal获取地理坐标,计算差值再重新写入

配准效果:

result

项目位置:AtmosphereMao/transelator_tif

评论


暂无评论


* 登录后即可评论

©2022 联系我们

粤ICP备2022023863号
500x500