python實(shí)現(xiàn)無(wú)人機(jī)航拍圖片像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)的示例代碼
背景
已知相機(jī)參數(shù)(傳感器寬度和高度、圖像寬度和高度、焦距、相對(duì)航高、像主點(diǎn)坐標(biāo) ),在給定像素坐標(biāo)的前提下,求世界坐標(biāo),大部分通過(guò)AI來(lái)實(shí)現(xiàn),不知道哪個(gè)步驟有問(wèn)題,望大家指正
腳本
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\對(duì)圖像去畸變
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]
# 相機(jī)坐標(biāo)轉(zhuǎn)世界坐標(biāo)
def camera_to_world_coordinates(cam_coords, pos):
# 獲取相機(jī)到世界的轉(zhuǎn)換參數(shù)
pos_x, pos_y, pos_z, roll, pitch, yaw = pos
# 將角度轉(zhuǎn)換為弧度
roll = np.radians(roll)
pitch = np.radians(pitch)
yaw = np.radians(yaw)
# 計(jì)算旋轉(zhuǎn)矩陣
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
# 相機(jī)坐標(biāo)轉(zhuǎn)換到世界坐標(biāo)
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__":
####################################################基本參數(shù)
# 傳感器寬度和高度(毫米)
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
# 相對(duì)航高(米)
H=86.93
#像主點(diǎn)坐標(biāo) (像素)
xpoff_px=20.88973563438230485190
ypoff_px=50.51977022866981315019
#################################################### 1\計(jì)算空間分辨率
# 傳感器尺寸轉(zhuǎn)換為米
sensor_width_m = sensor_width_mm / 1000
sensor_height_m = sensor_height_mm / 1000
# 計(jì)算水平和垂直的 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\給定像素坐標(biāo),計(jì)算相機(jī)坐標(biāo)
# 像素坐標(biāo)
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
# 計(jì)算相機(jī)坐標(biāo)(假設(shè)無(wú)畸變)
camera_x = pixel_x * GSD_x
camera_y = pixel_y * GSD_y
print("像素坐標(biāo) (", oripixel_x, ",", oripixel_y, ") 對(duì)應(yīng)的相機(jī)坐標(biāo) (x, y): (", camera_x, "米, ", camera_y, "米)")
#################################################### 3\計(jì)算畸變后坐標(biāo)
# 對(duì)稱畸變系數(shù)
sym_dist = [0, -0.00043396118129128110, 0.00000262222711982075, -0.00000001047488706013]
# 徑向畸變
dec_dist = [0.00000205885592671873, -0.00000321714140091248, 0]
# 進(jìn)行畸變校正
undistorted_camera_x, undistorted_camera_y = undistort_pixel(pixel_x, pixel_y, sym_dist, dec_dist)
print("畸變校正后像素坐標(biāo) (", oripixel_x, ",", oripixel_y, ") 對(duì)應(yīng)的相機(jī)坐標(biāo) (x, y): (", undistorted_camera_x, "米, ", undistorted_camera_y, "米)")
#################################################### 4\計(jì)算世界坐標(biāo)
# POS數(shù)據(jù)
pos = [433452.054688, 2881728.519704, 183.789696, 0.648220, -0.226028, 14.490357]
# 計(jì)算世界坐標(biāo)
world_coords = camera_to_world_coordinates((undistorted_camera_x, undistorted_camera_y), pos)
print("旋轉(zhuǎn)平移變換后像素坐標(biāo) (", oripixel_x, ",", oripixel_y, ") 對(duì)應(yīng)的世界坐標(biāo) (x, y): (", world_coords[0], "米, ", world_coords[1], "米)")到此這篇關(guān)于python實(shí)現(xiàn)無(wú)人機(jī)航拍圖片像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)的示例代碼的文章就介紹到這了,更多相關(guān)python無(wú)人機(jī)航拍圖片像素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python實(shí)現(xiàn)WGS84火星百度及web墨卡托四種坐標(biāo)系相互轉(zhuǎn)換
- Python實(shí)現(xiàn)常見(jiàn)坐標(biāo)系的相互轉(zhuǎn)換
- Python實(shí)現(xiàn)常見(jiàn)的4種坐標(biāo)互相轉(zhuǎn)換
- 使用Python和GDAL給圖片加坐標(biāo)系的實(shí)現(xiàn)思路(坐標(biāo)投影轉(zhuǎn)換)
- Python經(jīng)緯度坐標(biāo)轉(zhuǎn)換為距離及角度的實(shí)現(xiàn)
- 解決python gdal投影坐標(biāo)系轉(zhuǎn)換的問(wèn)題
- 代碼分析Python地圖坐標(biāo)轉(zhuǎn)換
相關(guān)文章
python實(shí)現(xiàn)簡(jiǎn)單的socket server實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)簡(jiǎn)單的socket server的方法,實(shí)例分析了Python中socket的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
python 時(shí)間信息“2018-02-04 18:23:35“ 解析成字典形式的結(jié)果代碼詳解
本文是類方法給大家介紹如何將python 時(shí)間信息“2018-02-04 18:23:35“ 解析成字典形式的結(jié)果,需要的朋友可以參考下2018-04-04
pytorch1.0中torch.nn.Conv2d用法詳解
今天小編就為大家分享一篇pytorch1.0中torch.nn.Conv2d用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Opencv中的cv2.calcHist()函數(shù)的作用及返回值說(shuō)明
這篇文章主要介紹了Opencv中的cv2.calcHist()函數(shù)的作用及返回值說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
pytest用例間參數(shù)傳遞的兩種實(shí)現(xiàn)方式示例
pytest提供了許多運(yùn)行命令以供定制化運(yùn)行某一類測(cè)試用例或者某個(gè)測(cè)試用例等,下面這篇文章主要給大家介紹了關(guān)于pytest用例間參數(shù)傳遞的兩種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境
這篇文章主要介紹了Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
python中l(wèi)iteral_eval函數(shù)的使用小結(jié)
literal_eval是Python標(biāo)準(zhǔn)庫(kù)ast模塊中的一個(gè)安全函數(shù),用于將包含 Python字面量表達(dá)式的字符串安全地轉(zhuǎn)換為對(duì)應(yīng)的Python對(duì)象,下面就來(lái)介紹一下literal_eval函數(shù)的使用2025-08-08

