使用PIL获取EXIF焦距报错:'IFDRational'对象不支持索引的咨询
问题描述
我在运行Medium平台上《Stereo 3D Reconstruction with OpenCV Using an iPhone Camera Part II》一文的图像3D重建示例时,按照文中代码提取图像EXIF焦距出现报错。
原代码:
exif_data = { PIL.ExifTags.TAGS[k]:v for k, v in exif_img._getexif().items() if k in PIL.ExifTags.TAGS} # 获取元组形式的焦距 focal_length_exif = exif_data['FocalLength'] # 获取十进制形式的焦距 focal_length = focal_length_exif[0]/focal_length_exif[1]
报错提示:'IFDRational' object does not support indexing
观察到focal_length_exif是IFDRational类型的结构,想询问是否可以通过focal_length = focal_length_exif.real来获取399/100的数值?
解决方案
不推荐用.real属性,它是复数类型的属性,用来获取实部,并非IFDRational类型的标准用法。更可靠的方式有两种:
直接用
float()方法转换为十进制数值:focal_length = float(focal_length_exif)访问IFDRational对象的
numerator(分子)和denominator(分母)属性手动计算:focal_length = focal_length_exif.numerator / focal_length_exif.denominator
这两种方法都能准确得到你需要的399/100对应的十进制数值。
内容的提问来源于stack exchange,提问作者Lake_Lagunita
相关产品推荐
相关产品推荐

