python实现无人机航拍图片像素坐标转世界坐标的示例代码
更新时间:2024年06月12日 11:29:08 作者:GIS从业者
已知相机参数在给定像素坐标的前提下,求世界坐标,大部分通过AI来实现,本文给大家分享实现脚本,感兴趣的朋友跟随小编一起看看吧
背景
已知相机参数(传感器宽度和高度、图像宽度和高度、焦距、相对航高、像主点坐标 ),在给定像素坐标的前提下,求世界坐标,大部分通过AI来实现,不知道哪个步骤有问题,望大家指正
脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 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实现无人机航拍图片像素坐标转世界坐标的示例代码的文章就介绍到这了,更多相关python无人机航拍图片像素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
Python的地形三维可视化Matplotlib和gdal使用实例
这篇文章主要介绍了Python的地形三维可视化Matplotlib和gdal使用实例,具有一定借鉴价值,需要的朋友可以了解下。2017-12-12
最新评论