------------- 背景 --------------------------------------------------
一般地,无人机航拍图像都是一种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'(.*) ', 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