python读取图片的exif信息
图片的exif信息
图片信息也是存在元数据的,网上官方称之为exif(exchange image file format),中文意思是交换图像文件格式。
每张图片都包含EXIF信息,它是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
要注意的是有些图片是没有元数据的,比如压缩过的图片,元数据被破坏,无法探测,所以图片一定要是原图。
EXIF可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。总结来说EXIF信息包含着该照片的拍照基本信息。
exifread第三方库
在进行三维重建软件的使用过程中,这里我使用的是OpenMVG+PMVS/CMVS的开源软件。
当软件配置好后,使用实例图片立马就完成了稠密重建。
如果换用自己手机拍摄的图片,也可以完成三维重建。
但是当用电脑截取的一个物体的多视角图片的时候,却不能完成三维重建。会报以下错误:
Traceback (most recent call last):
File “/home/program.py”, line 74, in import_images
info = self.get_image_exif(file_path)
File “/home/program.py”, line 94, in get_image_exif
‘Image Model’:tags.get(‘Image Model’, ‘0’).values
AttributeError: ‘str’ object has no attribute 'values’
根据代码,程序在执行过程中,会读取图片的exif信息,之后在CAMERA_SENSOR_WIDTH_DIRECTORY中去找寻对应的相机信息,用手机拍摄的图片可以成功进行三维重建,是因为相机信息中,已经有了对应的相机参数,相机内参是确定的,但是用电脑截图的数据,是缺少exif数据的,所以程序在执行时,不能找到确定的相机内参。
相机的内参矩阵
相机的内参矩阵为K,在百度中都可以找到详细的定义。
对于图像处理问题来说,相机内参的数据是比较好获得的。其中矩阵中的Cx和Cy都是像素中心的坐标,可以直接按照图像宽和高的1/2去设置,剩下的参数就是焦距了。
内参矩阵的焦距不是相机焦距f而是像元焦距,即fx=f/dx,y方向上同理,dx与dy都是相机的像元尺寸,一般是相等的,但其实也有不相等的,也有有误差的情况,是制造相机过程中保证的。
一般在程序中,焦距都是一个几千的数字,这时,这个焦距就是指的像元焦距,是没有单位不带量纲的。
而我们截图过程中的焦距是不知道的,查找到一个公式f=1.2*max(H,W),即,焦距(这里为像元焦距)可以取图像高和宽中最大值的1.2倍,这时,焦距就有了一个参考值。
后面三维重建的问题,就是生成截图数据的exif文件,并将内参写进相机参数文件中就行,或者直接在程序中写死内参,不去查询相机参数文件。
读取图片exif信息的代码
下面这段代码是用第三方库exifread读取exif信息的代码,大家可以在这个基础上更改。
import exifread # 专门用来读图片exif信息的库
import os
file_path = "/home/images" # 输入文件夹
def get_image_exif(path):
f = open(path, 'rb')
tags = exifread.process_file(f)
info = {
'Image Model': tags.get('Image Model', '0').values
}
f.close()
return info
for filename in os.listdir(file_path): # 遍历输入路径,得到图片名
if filename.endswith(('.jpg', '.jpeg', 'JPG')):
print(filename)
file_name_path = file_path + '/' + filename
print(file_name_path)
info = get_image_exif(file_name_path)
print(info)