三种方式获取大疆照片的EXIF/XMP信息(附测试代码)

songxf
2021-12-24 / 0 评论 / 1,072 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年01月29日,已超过309天没有更新,若内容或图片失效,请留言反馈。

目录

  • 软件方式
  • 在线方式
  • Python方式

    • 第一种:pyexiv2
    • 第二种:pyexif
  • 测试代码

47480-42mozxkheh1.png

软件方式

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()

效果
22941-drh843ktqeu.png

缺点

1、缺少相机的视角FOV信息

第二种:pyexif

安装

pip3 install pyexif

还要额外安装一个工具:exiftool
Installing ExifTool
https://exiftool.org/install.html
81787-cogg5b0vhtv.png

使用

import pyexif
img = pyexif.ExifEditor('DJI_0150.JPG')
img.getDictTags()

效果
91236-k1nnzxn8ge.png

优点
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())
0

评论 (0)

取消