撮影画像の撮影日,中心経緯度,焦点距離,撮影高さ,航行角などのシリーズ情報を抽出する.
-----------------背景------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一般的に、ドローン撮影画像はEXIFタイプの画像である.
画像の内部プロパティには、撮影日、画像の中心経緯度、焦点距離、高さ、航路角、ロール角、ピッチ角など、非常に豊富なシリーズ値があります(右クリック画像のプロパティであれば、すべて表示されます).
具体的なEXIF画像のすべての属性は、このサイトを参考にしてもいいです.https://tuchong.com/photo/11686356/exif/
------------------方法-----------------------------------------------------
1.画像の撮影日時と中心経緯度を抽出する
2.画像の3種類の偏角(偏角、ロール角、ピッチ角)を抽出
2.画像の焦点距離や撮影高さなどを抽出する
(注:exifのシリーズ属性を取得することを目的として、他の方法で取得することもできます.
また、以下のように取得するtags変数では、exifピクチャから多くの豊富な属性値が抽出され、自分で取ればよいが、ここでは焦点距離と高さだけを取り、focalを取り終えた.numは具体的な値!!)
一般的に、ドローン撮影画像はEXIFタイプの画像である.
画像の内部プロパティには、撮影日、画像の中心経緯度、焦点距離、高さ、航路角、ロール角、ピッチ角など、非常に豊富なシリーズ値があります(右クリック画像のプロパティであれば、すべて表示されます).
具体的なEXIF画像のすべての属性は、このサイトを参考にしてもいいです.https://tuchong.com/photo/11686356/exif/
------------------方法-----------------------------------------------------
1.画像の撮影日時と中心経緯度を抽出する
import exifread
import cv2
import math
from math import radians
def pic_c_lat_lng(photo):
"""
EXIF , ,
:param photo:
:return:
"""
# Open image file for reading (binary mode)
f = open(photo, 'rb')
# Return Exif tags
tags = exifread.process_file(f)
try:
#
EXIF_Date = tags["EXIF DateTimeOriginal"].printable
#
LatRef = tags["GPS GPSLatitudeRef"].printable
Lat = tags["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
Lat = float(Lat[0]) + float(Lat[1]) / 60 + float(Lat[2]) / float(Lat[3]) / 3600
if LatRef != "N":
Lat = Lat * (-1)
#
LonRef = tags["GPS GPSLongitudeRef"].printable
Lon = tags["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
Lon = float(Lon[0]) + float(Lon[1]) / 60 + float(Lon[2]) / float(Lon[3]) / 3600
if LonRef != "E":
Lon = Lon * (-1)
f.close()
except:
return "ERROR: EXIF 。"
else:
return EXIF_Date, Lat, Lon
2.画像の3種類の偏角(偏角、ロール角、ピッチ角)を抽出
def get_exifinfo(file_name):
'''
file_name : ,
'''
from PIL import Image
from PIL.ExifTags import TAGS
import pandas as pd
#
## 1.
img = Image.open(file_name)
#
## 2.
#
info = img._getexif()
# (1)
columns_list = ['nice','k','v']
data_list = []
# (2)
if info is None:
print("No Info")
else:
for k, v in info.items():
nice = TAGS.get(k, k)
#print( '%s (%s) = %s' % (nice, k, v) )
data_list.append([nice, k, v])
# (3)
exif_df = pd.DataFrame(columns=columns_list,data=data_list)
#
return exif_df
def get_FlightDrgreeInfo(file_name):
import re
'''
file_name : ,
'''
## 1.
df = get_exifinfo(file_name)
## 2. XMP
XMLPacket = df[df['nice']=='XMLPacket']['v'].tolist()[0]
## 3. XMLPacket
FlightYawDegree = re.findall(r'(.*) ', str(XMLPacket))[0]
# 4
FlightRollDegree = re.findall(r'(.*) ', str(XMLPacket))[0]
# 5
FlightPitchDegree = re.findall(r'(.*) ', str(XMLPacket))[0]
return FlightYawDegree, FlightRollDegree, FlightPitchDegree
2.画像の焦点距離や撮影高さなどを抽出する
(注:exifのシリーズ属性を取得することを目的として、他の方法で取得することもできます.
また、以下のように取得するtags変数では、exifピクチャから多くの豊富な属性値が抽出され、自分で取ればよいが、ここでは焦点距離と高さだけを取り、focalを取り終えた.numは具体的な値!!)
import exifread
def get_pic_f_h(file_name):
"""
:param file_name:
:return:
"""
import exifread
f = open(file_name, 'rb')
tags = exifread.process_file(f)
print(tags) # , , , ,
##
fleight_h = tags['GPS GPSAltitude'].values[0]
##
focal = tags['EXIF FocalLength'].values[0]
return focal, fleight_h