OpenCV imwrite,图像旋转获取

3

我正在使用Python中的OpenCV(cv2)对格式为jpg、png和jpeg、JPG的图像进行处理。我正在做一个测试,使用“cv2.imread”读取图像后立即使用“cv2.imwrite”将其写入磁盘。我发现一些图像的部分会旋转,有些旋转90度,有些旋转180度。但大多数图像保持正确的方向。我无法得出导致这种旋转的模式结论。有人知道更多细节吗?谢谢!


展示你的代码。 - Geancarlo Murillo
希望能看到编码部分! - bglbrt
1
@GeancarloMurillo ...以及您的数据。请参阅:[mcve]。 - AMC
感谢您的建议。这些数据是私密的。至于代码,我只用了两行:img = cv2.imread(file_path) cv2.imwrite(new_file_path, img) - Kenny
3个回答

3
这段文字似乎是关于EXIF方向标志的:
“为什么我的图片显示错误? 当您使用照片查看器在计算机上查看图像时,如果照片查看器可以读取Exif信息并尊重该信息,则它将根据方向信息自动旋转原始图像。最终结果是,您可以看到正确定位的照片,无论它实际上如何存储。”
这意味着,在桌面上查看图像时,图像看起来正常,因为文件信息中说“在显示之前将此图像旋转90度”。如果您的脚本不读取EXIF信息,则会存储一个新图像,没有标志,因此图像显示为旋转状态。
然而,根据 this answer,自OpenCV 3.1版本以来,opencv会自动处理这个问题。你的OpenCV版本是否更新? 原文链接 更新
此问题的评论中有人提到,你不能使用openCV写入exif数据。
你也可以使用exifreadPIL在脚本中获取exif数据并旋转图像。

谢谢,我进行了一些调查,相信这是由于元数据中的旋转信息导致的。你有没有办法在OpenCV中检索到这些信息,并确保在使用imwrite时旋转信息仍然存在? - Kenny
让我澄清一些细节。在使用cv2.imread(img_path)之后,它将成为Python中的一个NumPy数组。如果此时旋转信息是正确的,那么当我将该数组写入文件时,它也应该是正确的;如果此时旋转信息不正确,原始图像的显示也将不正确。 - Kenny
我非常确定这是正确的。你检查了openCV版本吗?我无法重现你的问题,但我已经添加了一种可能的解决方法。 - J.D.

1

一种可能的解决方案是在使用imdecode加载图像时将cv2.IMREAD_UNCHANGED更改为cv2.IMREAD_COLOR。由于某些原因,“unchanged”无法正确读取EXIF元数据。


0

当使用cv2.VideoCapture()读取视频文件并使用cv2.imwrite()保存帧图像时,我遇到了类似的问题。这是因为OpenCV没有正确读取视频方向/旋转元数据导致的。即使在OpenCV 4中,这对我仍然是一个问题。

最后,我使用了scikit-video - 这是一个围绕ffmpeg的Python封装。再也没有旋转问题:http://www.scikit-video.org/stable/io.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接