一、问题背景
发现使用labelme直接读取含imageData(将图片bytes数据使用base64编码后的str数据)的json文件时,读上来的图片会发生自动旋转的问题。比如原先是横放的图,读进来后就成竖放的了,图片朝向(orientation)错误。
我们可以用一个形象的例子来说明这种错误:
为什么图片会多此一举地弄一个朝向信息,而不是一步到位呢?
试想这样一个例子:你想给女朋友拍照,她很高,所以你把相机旋转了90度,最后成功拍了个全身照。
可能这个过程你已经重复过无数次,觉得非常自然。但仔细想想,相机的镜头是不会旋转的,也就是说如果人为地把相机旋转90度再拍照,拍下来的女朋友就会是横着站立,而不是正常的竖着站立。就像当你歪着头时,看到的世界也是歪着的。
为了防止这种诡异的现象出现,相机很机智地给图片加上了orientation标签,并“提醒”自己:这张图拍的时候我被旋转了90度,给主人看的时候要记得正过来。
所以这种记录方式的产生其实是两个因素导致的:①相机总是忠实地记录当时的场景,正的就是正的,反的就是反的;②相机希望记录当时的朝向,以方便做任何朝向上的调整。
二、产生原因
那么具体来说,在labelme的图片读取过程中哪里出问题会导致平时自动调整朝向的图片没有调整呢?
接着我们顺着labelme的流程走一遍
-
获取图片信息:labelme在读取json时会有一个if语句,如果有imageData,则直接获取imageData;如果没有imageData,则顺着imagePath找图片文件,然后读取图片文件:
if data["imageData"] is not None: imageData = base64.b64decode(data["imageData"]) if PY2 and QT4: imageData = utils.img_data_to_png_data(imageData) else: # relative path from label file to relative path from cwd imagePath = osp.join(osp.dirname(filename)