基于无人机正摄JPG图像实现像素GPS定位

基于无人机正摄JPG图像实现像素GPS定位

原理

  1. 无人机正摄图采用90度俯仰角,也即相机竖直向下拍摄,假设地面平坦,则相机与地平面可构成相机投影模型
    基于正摄图的相机模型
  2. 从相机参数获取到焦距f,以及物理像平面与图像像平面的转换关系,也即将像素px单位转换为mm单位才能进行物理测量。红外相机可以直接从像元间距获得转换关系,可见光相机可以借助相机标定通过内参获得。
    相机参数
  3. 从照片exif信息中提取出GPS信息
  4. 计算出从像平面到地平面物理距离的转换关系ratio=h/f,以及当前位置单位经纬度对应的距离转换关系
  5. 计算所求像素到中心像素的偏移dx_pix和dy_pix,将偏移从像平面转换到CCD上的物理偏移dx_ccd和dy_ccd,再转换到地面的位置偏移dx_real和dy_real,再通过经纬度和距离的换算关系得到经纬度偏移。
  6. 根据照片中心经纬度和目标像素经纬度偏移得到最终目标经纬度。

代码

def calculate_pos(center_pix: tuple, center_pos: tuple, height: float, board_corners: np.ndarray) -> (float, float):
    focal_length, dist_per_pix = 91e-4, 12e-6 / 2  # unit: m, m/pix
    dist_per_lat, dist_per_lon = 111.31955 * 1e3, 111.31955 * 1e3 * cos(center_pos[1] * pi / 180)  # unit: m/deg, m/deg
    ratio = height / focal_length  # unit: None
    board_center = board_corners.mean(0)  # unit: pix
    dx_pix, dy_pix = board_center[0] - center_pix[0], center_pix[1] - board_center[1]  # unit: pix, pix
    dx_ccd, dy_ccd = dx_pix * dist_per_pix, dy_pix * dist_per_pix  # unit: m, m
    dx_real, dy_real = dx_ccd * ratio, dy_ccd * ratio  # unit: m, m
    dlon, dlat = dx_real / dist_per_lon, dy_real / dist_per_lat  # unit: deg, deg
    result = (center_pos[0] + dlon, center_pos[1] + dlat)
    return result
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值