????????又是掉頭發(fā)的一天,今天的任務是通過圖片中心點的地理坐標以及圖片中某點的像素坐標(即這個點位于圖片中的x,y坐標)計算該點的地理/投影坐標。經(jīng)過一整天的搜索,發(fā)現(xiàn)網(wǎng)上并沒有這方面的教程。然后就是想啊想,頭發(fā)一抓一大把,終于在網(wǎng)上零零散散的教程以及不斷摸索中解決了這個問題。
????????大致思路就是,先獲取圖片相對真北方向的偏轉角以及該點和圖片中心的連線與圖片的正北方向夾角;然后將圖片中心點的地理坐標轉換為投影坐標(如果這一步?jīng)]有中心點的地理坐標,那么你就不用繼續(xù)往下看了);最后就是通過圖片分辨率計算點到中心的實際距離,再通過夾角和中心點的投影坐標加加減減即可。話雖這么說,但實施起來真心不簡單啊?。。?/strong>
一、準備工作
1.獲取圖片中心點的經(jīng)緯度坐標/投影坐標(必須)
? ? ? ? 如果只有一張圖片的話,你完全可以右鍵圖片,查看其屬性,里面就有經(jīng)緯度坐標。同時也可以使用Python實現(xiàn),之前分享過【Python&GIS】判斷圖片中心點/經(jīng)緯度點是否在某個面內,所以這里就不解釋了,直接上代碼。
def Get_LatLon(path_image):
"""
:param path_image: 輸入圖片路徑
:return: 返回中心點經(jīng)緯度
"""
# 獲取圖片的經(jīng)緯度信息
f = open(path_image, 'rb')
contents = exifread.process_file(f)
longitude = contents["GPS GPSLongitude"].values
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
f.close()
return longitude_f, latitude_f
2.獲取圖片與真北方向的偏轉角(非必須)
? ? ? ? 如果你的圖片并不是無人機拍的,或者拍攝時圖片與真北方向并無夾角,那么就不需要這一步。這一步主要就是矯正相機拍攝時的偏轉,每種無人機的參數(shù)名可能不一樣,所以需要自行修改。
????????下面的代碼也可以獲取圖片中心點的經(jīng)緯度,但我之前以及用過第一步的代碼了,所以就繼續(xù)使用第一步的了,你們可以自己簡化。文章來源:http://www.zghlxwxcb.cn/news/detail-602679.html
def Get_Image_Yaw_angle(file_path):
"""
:param file_path: 輸入圖片路徑
:return: 圖片的偏航角
"""
# 獲取圖片偏航角
b = b"\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e"
a = b"\x3c\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20"
img = open(file_path, 'rb')
data = bytearray()
dj_data_dict = {}
flag = False
for line in img.readlines():
if a in line:
flag = True
if flag:
data += line
if b in line:
break
if len(data) > 0:
data = str(data.decode('ascii'))
lines = list(filter(lambda x: 'drone-dji:' in x, data.split("\n")))
for d in lines:
d = d.strip()[10:]
key, value = d.split("=")
dj_data_dict[key] = value
# print("Image_yaw",dj_data_dict["FlightYawDegree"][1:-1])
return float(dj_data_dict["FlightYawDegree"][1:-1])
3.獲取圖片目標點與中心點的連線和圖片正北方向的夾角(必須)
????????通俗來說,就是該點與圖片正上方的夾角,同樣這步也是用來矯正偏轉的,獲取該角度后,即可得到該點在投影坐標系中與真北方向的夾角。文章來源地址http://www.zghlxwxcb.cn/news/detail-602679.html
def Yaw_angle_calculation(x, y, x_Center, y_Center):
"""
:param x: 輸入圖片目標點的柵格坐標x
:param y: 輸入圖片目標點的柵格坐標y
:param x_Center: 輸入圖片的中心點x坐標
:param y_Center: 輸入圖片的中心點y坐標
:return: 目標點相對于中心點的偏轉角度
&#
到了這里,關于【Python&GIS】無人機影像的像素坐標計算圖片某點的地理/投影坐標的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!