【问题标题】:opencv imwrite, image get rotatedopencv imwrite,图像旋转
【发布时间】:2020-03-17 23:47:21
【问题描述】:

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

【问题讨论】:

  • 显示你的代码。
  • 也想看看编码位!
  • @GeancarloMurillo ...以及您的数据。请参阅:minimal reproducible example
  • 感谢您的建议。数据是私有的。至于代码,我只用了两行: img = cv2.imread(file_path) cv2.imwrite(new_file_path, img)

标签: python image opencv png jpeg


【解决方案1】:

听起来像是 EXIF 方向标志:

为什么我的图片显示错误?
当您使用照片查看器检查计算机上的图像时,如果照片查看器可以读取 Exif 信息并尊重该信息,它将根据方向信息自动旋转原始图像。最终结果是,无论实际存储方式如何,您都可以看到方向正确的照片。

意味着在桌面上查看时图像看起来正确,因为文件信息显示“在显示前将此图像旋转 90d”。如果您的脚本没有读取 EXIF 信息,它会存储一个没有标志的新图像,因此图像会旋转显示。

但是,根据this answer,opencv 自 3.1 版起自动处理此问题。你的 openCV 版本是最新的吗?

Source article

更新
this question 中的一条评论建议您无法使用 openCV 编写 exif 数据。
您还可以使用exifreadPIL 获取exif 数据并在脚本中旋转图像。

【讨论】:

  • 谢谢,我做了一些调查,并认为这是由于元数据中的轮换信息造成的。您是否知道如何在 opencv 中检索此信息并确保当我使用 imwrite 时,旋转信息仍然存在。
  • 让我澄清一些细节。在 cv2.imread(img_path) 之后,它是 python 中的一个 numpy 数组。如果这次旋转信息是正确的,那么当我将这个数组写入文件时,它应该也是正确的;如果这次旋转信息不正确,原图的显示也不正确。
  • 我很确定这是正确的。你检查过openCV版本吗?我无法重现您的问题,但我添加了一个可能的解决方法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多