当前位置: 首页 > news >正文

航拍无人机像素坐标转世界坐标

一、背景

已知相机参数(传感器宽度和高度、图像宽度和高度、焦距、相对航高、像主点坐标 ),在给定像素坐标的前提下,求世界坐标,大部分通过AI来实现,不知道哪个步骤有问题,望大家指正

二、代码
import numpy as np
import cv2
# 畸变校正
def undistort_pixel(pixel_x, pixel_y, sym_dist, dec_dist):
    k0,k1,k2,k3=sym_dist
    # k1, k2, p1, p2, k3 = sym_dist
    p1,p2,p3=dec_dist
    fx = focal_length_mm
    fy = focal_length_mm
    cx = xpoff_px
    cy = ypoff_px
    distCoeffs = np.array([k1, k2, p1, p2,k3])
    cameraMatrix = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
    distorted_points = np.array([[pixel_x, pixel_y]], dtype=np.float32)
    undistorted_points = cv2.undistortPoints(distorted_points, cameraMatrix, distCoeffs)
    #################################################### 4\对图像去畸变
    img = cv2.imread('./images/100_0004_0001.JPG')
    img_undistored = cv2.undistort(img, cameraMatrix, distCoeffs)
    cv2.imwrite('./images/100_0004_00011.JPG', img_undistored)
    return undistorted_points[0][0][0], undistorted_points[0][0][1]
# 相机坐标转世界坐标
def camera_to_world_coordinates(cam_coords, pos):
    # 获取相机到世界的转换参数
    pos_x, pos_y, pos_z, roll, pitch, yaw = pos
    # 将角度转换为弧度
    roll = np.radians(roll)
    pitch = np.radians(pitch)
    yaw = np.radians(yaw)
    # 计算旋转矩阵
    R_roll = np.array([
        [1, 0, 0],
        [0, np.cos(roll), -np.sin(roll)],
        [0, np.sin(roll), np.cos(roll)]
    ])
    R_pitch = np.array([
        [np.cos(pitch), 0, np.sin(pitch)],
        [0, 1, 0],
        [-np.sin(pitch), 0, np.cos(pitch)]
    ])
    R_yaw = np.array([
        [np.cos(yaw), -np.sin(yaw), 0],
        [np.sin(yaw), np.cos(yaw), 0],
        [0, 0, 1]
    ])
    R = R_yaw @ R_pitch @ R_roll
    # 相机坐标转换到世界坐标
    cam_coords_homogeneous = np.array([cam_coords[0], cam_coords[1], -H, 1])
    world_coords = R @ cam_coords_homogeneous[:3] + np.array([pos_x, pos_y, pos_z])
    return world_coords
if __name__ == "__main__":


取消
首页
编程
手机
软件
硬件
安卓
苹果
手游
教程
平面
服务器
首页 > 脚本专栏 > python > python无人机航拍图片像素坐标
python实现无人机航拍图片像素坐标转世界坐标的示例代码
2024-06-12 10:42:38 作者:GIS从业者

已知相机参数在给定像素坐标的前提下,求世界坐标,大部分通过AI来实现,本文给大家分享实现脚本,感兴趣的朋友跟随小编一起看看吧
背景
已知相机参数(传感器宽度和高度、图像宽度和高度、焦距、相对航高、像主点坐标 ),在给定像素坐标的前提下,求世界坐标,大部分通过AI来实现,不知道哪个步骤有问题,望大家指正

脚本
import numpy as np
import cv2
# 畸变校正
def undistort_pixel(pixel_x, pixel_y, sym_dist, dec_dist):
    k0,k1,k2,k3=sym_dist
    # k1, k2, p1, p2, k3 = sym_dist
    p1,p2,p3=dec_dist
    fx = focal_length_mm
    fy = focal_length_mm
    cx = xpoff_px
    cy = ypoff_px
    distCoeffs = np.array([k1, k2, p1, p2,k3])
    cameraMatrix = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
    distorted_points = np.array([[pixel_x, pixel_y]], dtype=np.float32)
    undistorted_points = cv2.undistortPoints(distorted_points, cameraMatrix, distCoeffs)
    #################################################### 4\对图像去畸变
    img = cv2.imread('./images/100_0004_0001.JPG')
    img_undistored = cv2.undistort(img, cameraMatrix, distCoeffs)
    cv2.imwrite('./images/100_0004_00011.JPG', img_undistored)
    return undistorted_points[0][0][0], undistorted_points[0][0][1]
# 相机坐标转世界坐标
def camera_to_world_coordinates(cam_coords, pos):
    # 获取相机到世界的转换参数
    pos_x, pos_y, pos_z, roll, pitch, yaw = pos
    # 将角度转换为弧度
    roll = np.radians(roll)
    pitch = np.radians(pitch)
    yaw = np.radians(yaw)
    # 计算旋转矩阵
    R_roll = np.array([
        [1, 0, 0],
        [0, np.cos(roll), -np.sin(roll)],
        [0, np.sin(roll), np.cos(roll)]
    ])
    R_pitch = np.array([
        [np.cos(pitch), 0, np.sin(pitch)],
        [0, 1, 0],
        [-np.sin(pitch), 0, np.cos(pitch)]
    ])
    R_yaw = np.array([
        [np.cos(yaw), -np.sin(yaw), 0],
        [np.sin(yaw), np.cos(yaw), 0],
        [0, 0, 1]
    ])
    R = R_yaw @ R_pitch @ R_roll
    # 相机坐标转换到世界坐标
    cam_coords_homogeneous = np.array([cam_coords[0], cam_coords[1], -H, 1])
    world_coords = R @ cam_coords_homogeneous[:3] + np.array([pos_x, pos_y, pos_z])
    return world_coords
if __name__ == "__main__":
    ####################################################基本参数
    # 传感器宽度和高度(毫米)
   sensor_width_mm = 12.83331744000000007588
    sensor_height_mm = 8.55554496000000064271
    # 图像宽度和高度(像素)
    image_width_px = 5472
    image_height_px = 3648
    # 焦距(毫米)
    focal_length_mm = 8.69244671863242679422
    # 焦距(米)
    focal_length_m = 8.69244671863242679422/1000
    # 相对航高(米)
    H=86.93
    #像主点坐标 (像素)
    xpoff_px=20.88973563438230485190
    ypoff_px=50.51977022866981315019
    #################################################### 1\计算空间分辨率
    # 传感器尺寸转换为米
    sensor_width_m = sensor_width_mm / 1000
    sensor_height_m = sensor_height_mm / 1000
    # 计算水平和垂直的 GSD
    GSD_x = (sensor_width_m/image_width_px) * (H / focal_length_m )
    GSD_y = (sensor_height_m /image_height_px) * (H / focal_length_m)
    # 水平和垂直方向的 GSD
    print("水平方向的 GSD:", GSD_x, "米/像素")
    print("垂直方向的 GSD:", GSD_y, "米/像素")
    #################################################### 2\给定像素坐标,计算相机坐标
    # 像素坐标
    oripixel_x = image_width_px
    oripixel_y = image_height_px
    # oripixel_x = image_width_px/2
    # oripixel_y = image_height_px/2
    # oripixel_x = 0
    # oripixel_y = 0
    pixel_x=oripixel_x-xpoff_px-image_width_px/2
    pixel_y=oripixel_y-ypoff_px-image_height_px/2
    # 计算相机坐标(假设无畸变)
    camera_x = pixel_x * GSD_x
    camera_y = pixel_y * GSD_y
    print("像素坐标 (", oripixel_x, ",", oripixel_y, ") 对应的相机坐标 (x, y): (", camera_x, "米, ", camera_y, "米)")
    #################################################### 3\计算畸变后坐标
    # 对称畸变系数
    sym_dist = [0, -0.00043396118129128110, 0.00000262222711982075, -0.00000001047488706013]
    # 径向畸变
    dec_dist = [0.00000205885592671873, -0.00000321714140091248, 0]
    # 进行畸变校正
    undistorted_camera_x, undistorted_camera_y = undistort_pixel(pixel_x, pixel_y, sym_dist, dec_dist)
    print("畸变校正后像素坐标 (", oripixel_x, ",", oripixel_y, ") 对应的相机坐标 (x, y): (", undistorted_camera_x, "米, ", undistorted_camera_y, "米)")
    #################################################### 4\计算世界坐标
    # POS数据
    pos = [433452.054688, 2881728.519704, 183.789696, 0.648220, -0.226028, 14.490357]
    # 计算世界坐标
    world_coords = camera_to_world_coordinates((undistorted_camera_x, undistorted_camera_y), pos)
    print("旋转平移变换后像素坐标 (", oripixel_x, ",", oripixel_y, ") 对应的世界坐标 (x, y): (", world_coords[0], "米, ", world_coords[1], "米)")
到此这篇关于python实现无人机航拍图片像素坐标转世界坐标的示例代码的文章就介绍到这了。

http://www.lryc.cn/news/373006.html

相关文章:

  • Linux系统学习——指令二
  • 【逻辑回归】和【线性回归】的区别和联系-九五小庞
  • 富格林:正视欺诈阻挠交易被骗
  • 如何在WPS中加载EndNote X9插件
  • vb.net小demo(计算器、文件处理等/C#也可看)
  • 【vue3|第8期】深入理解Vue 3 computed计算属性
  • 《精通ChatGPT:从入门到大师的Prompt指南》附录C:专业术语表
  • YOLOv8可视化界面PYQT5
  • 远程代码执行和远程命令执行是一个东西吗
  • C++ 20新特性之线程与jthread
  • 赶紧收藏!2024 年最常见 20道并发编程面试题(七)
  • HAL库开发--第一盏灯
  • Linux C语言:变量的作用域和生命周期(auto、register、static和extern)
  • AI Stable diffusion 报错:稳定扩散模型加载失败,退出
  • [Python学习篇] Python循环语句
  • MongoDB 正则表达式
  • Django配置连接池:使用django-db-connection-pool配置连接池
  • SpringBoot整合钉钉实现消息推送
  • 【机器学习】集成学习方法:Bagging与Boosting的应用与优势
  • 工业 web4.0 的 UI 卓越非凡
  • C语言 | Leetcode C语言题解之第145题二叉树的后序遍历
  • 如何在 Vue 3 中使用 vue3-print-nb 实现灵活的前端打印
  • Go Module详解
  • 基于51单片机的智能水表
  • SQLServer 借助Navcate做定时备份的脚本
  • MBD_入门篇_21_SimulinkSignalAttributes
  • Web前端高级课程:深入探索与技能飞跃
  • 螺丝工厂vtk ThreadFactory(1)
  • Android13 蓝牙协议属性配置详解
  • 南通国际高中有哪些?南通惠立学校高中部校长见面日重磅来袭