目录
- 软件方式
- 在线方式
Python方式
- 第一种:pyexiv2
- 第二种:pyexif
- 测试代码
软件方式
Download KUSO Exif Viewer 3.0 (softpedia.com)
https://www.softpedia.com/get/Multimedia/Graphic/Digital-Photo-Tools/KUSO-Exif-Viewer.shtml
优点:内容很全
缺点:效率低,非编程式
在线方式
EXIF信息查看器 (tuchong.com)
https://exif.tuchong.com/
优缺点同上
Python方式
两种库:
第一种:pyexiv2
安装
pip3 install pyexiv2
使用
from pyexiv2 import Image
img = Image(r'D:\DCIM\100MEDIA\DJI_0150.JPG')
img.read_xmp()
img.read_exif()
效果
缺点
1、缺少相机的视角FOV信息
第二种:pyexif
安装
pip3 install pyexif
还要额外安装一个工具:exiftool
Installing ExifTool
https://exiftool.org/install.html
使用
import pyexif
img = pyexif.ExifEditor('DJI_0150.JPG')
img.getDictTags()
效果
优点
1、包含了FOV等内容
测试代码
# -*- coding: utf-8 -*-
# @Time : 2021/12/24 下午3:19
# @Author : 小锋学长生活大爆炸
# @FileName: dji_exif.py
# @Software: PyCharm
# @Blog : https://blog.csdn.net/sxf1061700625
import pyexif
import re
class DJIExif:
def __init__(self):
self.exif = None
self.tags = None
def setImage(self, imgPath) -> None:
self.tags = None # 更換圖片後需要重置緩存
self.exif = pyexif.ExifEditor(imgPath)
def getDictTags(self) -> dict:
self.tags = self.exif.getDictTags()
return self.tags
def convertGPSToSexagesimal(self, ori) -> float:
'''度分秒形式(40°45´42.757")轉爲六十進制(40.7618770°)'''
pattern = re.compile(r'[0-9]\d?\.?\d*')
matchObj = re.findall(pattern, ori)
d, m, s = map(float, matchObj)
return d + (m + s / 60) / 60
def getGPS(self) -> dict:
'''無人機的GPS坐標'''
GPSLatitude = self.convertGPSToSexagesimal(self.tags['GPSLatitude'])
GPSLongitude = self.convertGPSToSexagesimal(self.tags['GPSLongitude'])
GPSLatitudeRef = self.tags['GPSLatitudeRef']
GPSLongitudeRef = self.tags['GPSLongitudeRef']
return {'latitude': GPSLatitude, 'longitude': GPSLongitude, 'latitudeRef': GPSLatitudeRef, 'longitudeRef': GPSLongitudeRef}
def getFOV(self) -> float:
'''相機的視角'''
return float(self.tags['FOV'].split(' ')[0])
def getRelativeAltitude(self) -> float:
'''相對高度'''
return float(self.tags['RelativeAltitude'])
def getAbsoluteAltitude(self) -> float:
'''絕對高度(海拔)'''
return float(self.tags['AbsoluteAltitude'])
def getGimbalDegree(self) -> dict:
'''雲臺的3個姿態角度'''
GimbalRollDegree = float(self.tags['GimbalRollDegree'])
GimbalYawDegree = float(self.tags['GimbalYawDegree'])
GimbalPitchDegree = float(self.tags['GimbalPitchDegree'])
return {'roll': GimbalRollDegree, 'yaw': GimbalYawDegree, 'pitch': GimbalPitchDegree}
def getDroneDegree(self) -> dict:
'''雲臺的3個姿態角度'''
FlightRollDegree = float(self.tags['FlightRollDegree'])
FlightYawDegree = float(self.tags['FlightYawDegree'])
FlightPitchDegree = float(self.tags['FlightPitchDegree'])
return {'roll': FlightRollDegree, 'yaw': FlightYawDegree, 'pitch': FlightPitchDegree}
def getDroneStatus(self):
'''無人機的GPS坐標+三個角度+相機的視角+相對高度'''
gps = self.getGPS()
degree = self.getGimbalDegree()
fov = self.getFOV()
altitude = self.getRelativeAltitude()
return {'gps': gps, 'degree': degree, 'fov': fov, 'altitude': altitude}
if __name__ == '__main__':
img_path = '/home/sxf/Desktop/DJI_0150.JPG'
exif = DJIExif()
exif.setImage(img_path)
tags = exif.getDictTags()
print(tags)
print(exif.getRelativeAltitude())
print(exif.getAbsoluteAltitude())
print(exif.getFOV())
print(exif.getGimbalDegree())
print(exif.getDroneDegree())
print(exif.getGPS())
print(exif.getDroneStatus())
So good no one praises