撮影画像の撮影日,中心経緯度,焦点距離,撮影高さ,航行角などのシリーズ情報を抽出する.


-----------------背景------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一般的に、ドローン撮影画像は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