义乌营销型网站建设传奇网页游戏哪个好玩
一、背景
已知相机参数(传感器宽度和高度、图像宽度和高度、焦距、相对航高、像主点坐标 ),在给定像素坐标的前提下,求世界坐标,大部分通过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实现无人机航拍图片像素坐标转世界坐标的示例代码的文章就介绍到这了。
