首页 > 其他分享 >DJI无人机影像地理坐标系校正

DJI无人机影像地理坐标系校正

时间:2024-08-24 11:54:26浏览次数:10  
标签:lat image np drone params 无人机 DJI resolution 坐标系

介绍

代码简介

代码的主要功能是将无人机拍摄的图像中的每个像素位置转换为地理坐标(经纬度),并计算图像的实际物理尺寸。具体包括以下几个步骤:

  1. 坐标转换

    • 从图像的像素坐标开始,转换为归一化的图像平面坐标。
    • 将这些坐标转换为相机坐标系中的坐标,考虑到焦距的影响。
  2. 坐标系转换

    • 利用无人机的姿态(俯仰角、滚转角、偏航角)将相机坐标系的坐标转换到无人机的世界坐标系。
  3. 地理坐标计算

    • 将世界坐标系中的坐标转换为地理坐标(经纬度)。这里采用简单的地球模型来近似计算地理位置。
  4. 物理尺寸计算

    • 基于图像的分辨率、传感器尺寸和焦距,计算图像的实际物理宽度和高度(以米为单位)。

代码函数

  • pixel_to_latlon_matrix(image_resolution, camera_params, drone_params)
    主要函数,接受图像分辨率、相机参数和无人机参数,返回图像中每个像素的经纬度矩阵以及图像的实际物理宽度和高度。

  • rotation_matrix(pitch, roll, yaw)
    计算给定俯仰角、滚转角和偏航角的旋转矩阵,用于将相机坐标系转换到无人机的世界坐标系。

  • world_to_latlon_batch(dX, dY, drone_lat, drone_lon)
    将世界坐标系的偏移量转换为经纬度的偏移量,基于地球的半径和无人机的当前位置计算。

示例使用

  • 定义了一个示例的相机参数和无人机参数,包括焦距、传感器尺寸、图像分辨率、无人机的经纬度、海拔高度以及姿态角度。
  • 通过调用 pixel_to_latlon_matrix 函数计算图像的经纬度矩阵及其物理尺寸,并打印结果。

这段代码适用于将无人机拍摄的高分辨率图像中的每个像素位置准确地映射到地理坐标系中,并提供图像的实际物理尺寸,有助于进行地理信息分析和处理。

代码

import numpy as np

def pixel_to_latlon_matrix(image_resolution, camera_params, drone_params):
    # 创建坐标网格
    x_coords, y_coords = np.meshgrid(np.arange(image_resolution[0]), np.arange(image_resolution[1]))
    
    # 1. 像素坐标转换为归一化图像平面坐标
    x_pixel = (x_coords - image_resolution[0] / 2) * camera_params['sensor_size'][0] / image_resolution[0]
    y_pixel = (y_coords - image_resolution[1] / 2) * camera_params['sensor_size'][1] / image_resolution[1]
    
    # 2. 归一化图像平面坐标转换为相机坐标系
    Z_c = camera_params['focal_length'] / 1000  # 转换为米
    X_c = x_pixel * Z_c / camera_params['focal_length']
    Y_c = y_pixel * Z_c / camera_params['focal_length']
    
    # 3. 相机坐标系转换到无人机的世界坐标系
    pitch, roll, yaw = np.radians(drone_params['angles'])
    R = rotation_matrix(pitch, roll, yaw)
    world_coords = np.dot(R, np.array([X_c.flatten(), Y_c.flatten(), Z_c * np.ones_like(X_c.flatten())]))
    
    # 4. 计算地理坐标系(经纬度)
    drone_lat = drone_params['latitude']
    drone_lon = drone_params['longitude']
    
    latlon_matrix = np.zeros((image_resolution[1], image_resolution[0], 2))
    
    # 利用批量计算的世界坐标
    dX = world_coords[0, :].reshape(image_resolution[1], image_resolution[0])
    dY = world_coords[1, :].reshape(image_resolution[1], image_resolution[0])
    
    lat, lon = world_to_latlon_batch(dX, dY, drone_lat, drone_lon)
    
    latlon_matrix[:, :, 0] = lat
    latlon_matrix[:, :, 1] = lon
    
    # 计算图像的实际物理尺寸
    image_width_meters = camera_params['sensor_size'][0] * (image_resolution[0] / camera_params['focal_length']) * 1000
    image_height_meters = camera_params['sensor_size'][1] * (image_resolution[1] / camera_params['focal_length']) * 1000
    
    return latlon_matrix, image_width_meters, image_height_meters

def rotation_matrix(pitch, roll, yaw):
    R_x = np.array([
        [1, 0, 0],
        [0, np.cos(roll), -np.sin(roll)],
        [0, np.sin(roll), np.cos(roll)]
    ])
    
    R_y = np.array([
        [np.cos(pitch), 0, np.sin(pitch)],
        [0, 1, 0],
        [-np.sin(pitch), 0, np.cos(pitch)]
    ])
    
    R_z = np.array([
        [np.cos(yaw), -np.sin(yaw), 0],
        [np.sin(yaw), np.cos(yaw), 0],
        [0, 0, 1]
    ])
    
    return np.dot(R_z, np.dot(R_y, R_x))

def world_to_latlon_batch(dX, dY, drone_lat, drone_lon):
    a = 6378137.0  # Semi-major axis in meters
    f = 1 / 298.257223563  # Flattening
    b = a * (1 - f)  # Semi-minor axis
    
    lat_rad = np.radians(drone_lat)
    
    N = a / np.sqrt(1 - (2*f - f**2) * np.sin(lat_rad)**2)
    
    m_per_deg_lat = (np.pi / 180) * (a * (1 - f)) / (1 - (2*f - f**2) * np.sin(lat_rad)**2)**1.5
    m_per_deg_lon = (np.pi / 180) * (N * np.cos(lat_rad))
    
    delta_lat = dY / m_per_deg_lat
    delta_lon = dX / m_per_deg_lon
    
    object_lat = drone_lat + delta_lat
    object_lon = drone_lon + delta_lon
    
    return object_lat, object_lon

# 示例使用
camera_params = {
    'focal_length': 24,  # in mm
    'sensor_size': (36.0, 24.0),  # in mm, (width, height)
    'image_resolution': (8064, 6048)  # in pixels, (width, height)
}

drone_params = {
    'latitude': 40.052235,  # degrees
    'longitude': 116.243683,  # degrees
    'altitude': 179,  # meters
    'angles': (10, 5, 30)  # degrees, (pitch, roll, yaw)
}

latlon_matrix, image_width_meters, image_height_meters = pixel_to_latlon_matrix(camera_params['image_resolution'], camera_params, drone_params)

print(f'LatLon Matrix Shape: {latlon_matrix.shape}')
print(f'Image Width: {image_width_meters:.2f} meters')
print(f'Image Height: {image_height_meters:.2f} meters')

打印结果

LatLon Matrix Shape: (6048, 8064, 2)
Image Width: 41.47 meters
Image Height: 30.24 meters

标签:lat,image,np,drone,params,无人机,DJI,resolution,坐标系
From: https://blog.csdn.net/weixin_42448643/article/details/141460664

相关文章

  • VTK随笔三:坐标系统、空间变换、VTK管线、VTK智能指针
    一、坐标系统 Model坐标系统:定义模型时所采用的坐标系统,通常是局部的笛卡尔坐标系。World坐标系统:是放置Actor的三维空间坐标系,Actor(vtkActor类)其中的一个功能就是负责将模型从Model坐标系统变换到World坐标系统。每一个模型可以定义自己的Model坐标系统,但World坐标系只有......
  • 无人机的未来发展
    无人机已经成为军队、爱好者和急救人员的常用技术,超过十年来,无人机的种类和功能激增。如今,无人机不再仅限于电池寿命不足的小型四轴飞行器,而是正协助搜索和救援工作、改变乌克兰和加沙的战争局面,并运送时间敏感的医疗物资。而且,数十亿美元的资金正在投入到构建下一代完全自主系......
  • MBR40200PT-ASEMI无人机专用MBR40200PT
    编辑:llMBR40200PT-ASEMI无人机专用MBR40200PT型号:MBR40200PT品牌:ASEMI封装:TO-247批号:最新最大平均正向电流(IF):40A最大循环峰值反向电压(VRRM):200V最大正向电压(VF):0.70V~0..90V工作温度:-65°C~175°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正向浪涌电流(IFMS):350......
  • 无人机培训与装配维修技术详解
    一、无人机基础理论无人机,即无人驾驶航空器,凭借其灵活性、高效性和广泛应用性,已成为现代科技领域的热点之一。在学习无人机培训与装配维修技术之前,掌握无人机的基础理论是必不可少的。这包括但不限于:1.无人机分类:了解固定翼无人机、多旋翼无人机、直升机无人机等不同类型的......
  • CAAC小型六旋翼训练无人机技术详解
    电动六旋翼无人机,该无人机采用横向折叠臂,性能优秀、操控简单、安全性高,适合用于基础多旋翼飞行技能训练。同时,该无人机符合《民用无人机驾驶员管理规定》中关于多旋翼无人机训练类别的要求,可用于多旋翼无人机实践飞行训练。1.飞行原理与结构CAAC(中国民用航空局)认证的小型......
  • 起落架在无人机里面的主要作用,你清楚吗?
    起落架的主要作用体现在以下几个方面:支撑作用:起落架在无人机停放、滑行、起飞和着陆过程中提供必要的支撑,确保无人机能够稳定地停放在地面上,并在起飞和着陆时承受机身重量和冲击载荷。缓冲作用:起落架中的减震支柱等部件能够吸收无人机在着陆时的冲击能量,减少对机身和内部设备......
  • SBT30100VFCT-ASEMI无人机专用SBT30100VFCT
    编辑:llSBT30100VFCT-ASEMI无人机专用SBT30100VFCT型号:SBT30100VFCT品牌:ASEMI封装:TO-220F批号:最新最大平均正向电流(IF):30A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0..90V工作温度:-65°C~175°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正向浪涌电流......
  • <数据集>无人机航拍不同高度牧羊识别数据集<目标检测>
    数据集格式:VOC+YOLO格式图片数量:6065张标注数量(xml文件个数):6065标注数量(txt文件个数):6065标注类别数:1标注类别名称:['sheep']序号类别名称图片数框数1sheep6065149785使用标注工具:labelImg标注规则:对类别进行画水平矩形框图片示例:标注示例:......
  • 【四旋翼】四旋翼无人机的几何跟踪控制(含弹道 位置误差 速度误差)【含Matlab源码 7256
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • 如何设计一架无人机
    一、确定设计目标与需求1.任务需求  明确无人机将用于的具体任务,例如:航拍、农业喷洒、物流运输等2.性能指标  确定飞行时间、最大载荷、飞行高度和速度等性能指标二、进行初步设计和概念验证1.构思设计方案  根据性能指标和需求,进行初步的概念设计,包括机翼......