opencv imwrite,图像旋转

opencv imwrite, image get rotated

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

听起来像 EXIF 方向标志:

Why Are My Images Wrongly Displayed?
When you use a photo viewer to check the image on your computer, if the photo viewer can read the Exif info and respects that info, it will automatically rotate the raw image based on the orientation info. The end result is that you can see the correctly-oriented photo no matter how it is actually stored.

意味着在桌面上查看时图像看起来正确,因为文件信息显示 'rotate this image 90d before showing'。如果您的脚本不读取 EXIF 信息,它会存储一个新图像,不带标志,因此图像会旋转显示。

但是,根据 this answer,opencv 从 3.1 版开始自动处理这个问题。您的 openCV 版本是最新的吗?

Source article

更新
this question 中的评论建议您不能使用 openCV 编写 exif 数据。
您还可以使用 exifread or PIL 获取 exif 数据并在脚本中旋转图像。

在使用cv2.VideoCapture() 读取视频文件时使用cv2.imwrite() 保存帧图像时,我遇到了类似的问题。这是由于 OpenCV 没有正确读取视频 orientation/rotation 元数据。即使使用 OpenCV 4,这对我来说仍然是个问题。

我最终使用了 scikit-video - 一个围绕 ffmpeg 的 Python 包装器。不再有旋转问题:http://www.scikit-video.org/stable/io.html

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