提取航拍图像的拍摄日期,中心经纬度,焦距,航拍高度,航向角等系列信息。

-------------  背景 --------------------------------------------------

一般地,无人机航拍图像都是一种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. 提取图片中的  三种偏角 (偏向角,横滚角,俯仰角)

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'<drone-dji:FlightYawDegree>(.*)</drone-dji:FlightYawDegree>', str(XMLPacket))[0]
    # 4 横滚角信息
    FlightRollDegree = re.findall(r'<drone-dji:FlightRollDegree>(.*)</drone-dji:FlightRollDegree>', str(XMLPacket))[0]
    # 5 俯仰角信息
    FlightPitchDegree = re.findall(r'<drone-dji:FlightPitchDegree>(.*)</drone-dji:FlightPitchDegree>', 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

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值