Python PiCamera - 如何格式化 Exif 的坐标?
Python PiCamera - How do I format the coordinates for the Exif?
我上周刚拿到第一个 Raspberry Pi 产品。我有一个 Raspberry Pi 零 W 和一个 PiCamera。我创建了一个程序(由 crontab 每天 运行 ),它将拍照,将照片存储在本地,然后 运行 将照片的副本发送到本地服务器,制作 CSV 日志照片,并制作一份易于阅读的文本日报。我几乎所有的东西都正常工作,但我有一个我似乎无法弄清楚的特殊问题。
我每天都在使用 Python PiCamera 库拍摄照片,我想为每张照片的 EXIF 元数据设置一些静态 GPS 数据。 (GPS 数据需要是静态的,因为 Pi 被吸盘到 window 并且至少一年内不会移动)我需要帮助的问题是我不知道我需要如何格式化我的PiCamera exif_tag 属性 的 GPS 数据。以下是我尝试过但没有给我适当结果的一些格式:
尝试 #1 - 浮动
camera.exif_tags["GPS.GPSLatitude"] = 41.1027
camera.exif_tags["GPS.GPSLongitude"] = -85.1362
我收到这个错误:
Traceback (most recent call last):
File "main.py", line 13, in <module>
camera.capture(local_path)
File "/usr/lib/python3/dist-packages/picamera/camera.py", line 1418, in capture
encoder.start(output)
File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 1125, in start
self._add_exif_tag(tag, value)
File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 1097, in _add_exif_tag
ct.sizeof(mmal.MMAL_PARAMETER_EXIF_T) + len(tag) + len(value) + 1)
TypeError: object of type 'float' has no len()
尝试 #2 - 字符串
camera.exif_tags["GPS.GPSLatitude"] = "41.1027"
camera.exif_tags["GPS.GPSLongitude"] = "-85.1362"
运行这段代码没有报错,但是抓图后exif输出的数据还是不准确:
Latitude |0.040
Longitude |3162715.1775
跟进尝试 - 其他字符串
# Style 1
camera.exif_tags["GPS.GPSLatitude"] = "(41) (6) (10.711)"
camera.exif_tags["GPS.GPSLongitude"] = "(85) (8) (8.968)"
# This produces
Latitude |1.00
Longitude |1.00
# Style 2
camera.exif_tags["GPS.GPSLatitude"] = "41 6 10.711"
camera.exif_tags["GPS.GPSLongitude"] = "85 8 8.968"
# This produces
Latitude |6.8
Longitude |10.6
# Style 3
camera.exif_tags["GPS.GPSLatitude"] = "41, 6, 10.711"
camera.exif_tags["GPS.GPSLongitude"] = "85, 8, 8.968"
#This produces
Latitude |6.8, 0.014, 1.000
Longitude |10.6, 0.008, 2.141837875
所以,简而言之,任何人都可以通过提供格式化字符串的方法来帮助我吗?我完全不知所措。 PiCamera 的文档只列出了不同的标签,但没有解释如何格式化每个标签。
好吧,经过几个更多的测试用例,几个小时的研究,最后在 PiCamera GitHub 存储库上发布了一个问题,我终于弄明白了。如我的问题所述,没有关于 PiCamera 库的这个特定部分的直接文档。但是 repo 上的某个人能够向我指出关于添加 GPS exif 数据的 RaspiStill repo,它是用 C 编写的。我从未完全学习过 C,而且我的 C++ 技能有点生疏,但它给了我一个想法。最后的结果是这样的:
camera.exif_tags["GPS.GPSLatitude"] = "41/1,6/1,9577/1000"
camera.exif_tags["GPS.GPSLongitude"] = "85/1,8/1,10223/1000"
在查看 RaspiStill 存储库时,我想到了如何使用终端中的命令来设置 exif 数据,因此我查找了如何通过 RaspiStill 设置坐标并找到了提供示例的文档。
如何以度、分、秒的形式表示数据的一些示例:
- 52 = 52 / 1(52 个单位)
- 40.44 = 4044 / 100(4044 百分之一)
- 52.97790 = 52977900 / 1000000(百万分之 52977900)
- 0 = 0/1
这是我找到如何进行上述“计算”的来源:
希望这也能帮助到其他人。
我上周刚拿到第一个 Raspberry Pi 产品。我有一个 Raspberry Pi 零 W 和一个 PiCamera。我创建了一个程序(由 crontab 每天 运行 ),它将拍照,将照片存储在本地,然后 运行 将照片的副本发送到本地服务器,制作 CSV 日志照片,并制作一份易于阅读的文本日报。我几乎所有的东西都正常工作,但我有一个我似乎无法弄清楚的特殊问题。
我每天都在使用 Python PiCamera 库拍摄照片,我想为每张照片的 EXIF 元数据设置一些静态 GPS 数据。 (GPS 数据需要是静态的,因为 Pi 被吸盘到 window 并且至少一年内不会移动)我需要帮助的问题是我不知道我需要如何格式化我的PiCamera exif_tag 属性 的 GPS 数据。以下是我尝试过但没有给我适当结果的一些格式:
尝试 #1 - 浮动
camera.exif_tags["GPS.GPSLatitude"] = 41.1027
camera.exif_tags["GPS.GPSLongitude"] = -85.1362
我收到这个错误:
Traceback (most recent call last):
File "main.py", line 13, in <module>
camera.capture(local_path)
File "/usr/lib/python3/dist-packages/picamera/camera.py", line 1418, in capture
encoder.start(output)
File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 1125, in start
self._add_exif_tag(tag, value)
File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 1097, in _add_exif_tag
ct.sizeof(mmal.MMAL_PARAMETER_EXIF_T) + len(tag) + len(value) + 1)
TypeError: object of type 'float' has no len()
尝试 #2 - 字符串
camera.exif_tags["GPS.GPSLatitude"] = "41.1027"
camera.exif_tags["GPS.GPSLongitude"] = "-85.1362"
运行这段代码没有报错,但是抓图后exif输出的数据还是不准确:
Latitude |0.040
Longitude |3162715.1775
跟进尝试 - 其他字符串
# Style 1
camera.exif_tags["GPS.GPSLatitude"] = "(41) (6) (10.711)"
camera.exif_tags["GPS.GPSLongitude"] = "(85) (8) (8.968)"
# This produces
Latitude |1.00
Longitude |1.00
# Style 2
camera.exif_tags["GPS.GPSLatitude"] = "41 6 10.711"
camera.exif_tags["GPS.GPSLongitude"] = "85 8 8.968"
# This produces
Latitude |6.8
Longitude |10.6
# Style 3
camera.exif_tags["GPS.GPSLatitude"] = "41, 6, 10.711"
camera.exif_tags["GPS.GPSLongitude"] = "85, 8, 8.968"
#This produces
Latitude |6.8, 0.014, 1.000
Longitude |10.6, 0.008, 2.141837875
所以,简而言之,任何人都可以通过提供格式化字符串的方法来帮助我吗?我完全不知所措。 PiCamera 的文档只列出了不同的标签,但没有解释如何格式化每个标签。
好吧,经过几个更多的测试用例,几个小时的研究,最后在 PiCamera GitHub 存储库上发布了一个问题,我终于弄明白了。如我的问题所述,没有关于 PiCamera 库的这个特定部分的直接文档。但是 repo 上的某个人能够向我指出关于添加 GPS exif 数据的 RaspiStill repo,它是用 C 编写的。我从未完全学习过 C,而且我的 C++ 技能有点生疏,但它给了我一个想法。最后的结果是这样的:
camera.exif_tags["GPS.GPSLatitude"] = "41/1,6/1,9577/1000"
camera.exif_tags["GPS.GPSLongitude"] = "85/1,8/1,10223/1000"
在查看 RaspiStill 存储库时,我想到了如何使用终端中的命令来设置 exif 数据,因此我查找了如何通过 RaspiStill 设置坐标并找到了提供示例的文档。
如何以度、分、秒的形式表示数据的一些示例:
- 52 = 52 / 1(52 个单位)
- 40.44 = 4044 / 100(4044 百分之一)
- 52.97790 = 52977900 / 1000000(百万分之 52977900)
- 0 = 0/1
这是我找到如何进行上述“计算”的来源:
希望这也能帮助到其他人。