使用OpenCV imread读取图像时,图像的高度和宽度会被交换。

7
当我使用OpenCV的imread函数读取图像时,我发现其高度和宽度被交换了。比如我的原始图像尺寸为(610乘以406),但是使用OpenCV::imread函数读取后,其尺寸变成了406乘以610。即使在将原始图像旋转后传递给该函数,结果也没有任何变化。读取的图像仍具有原始尺寸。
请看以下示例代码和图像以获得进一步澄清:
因此,我提供了两个输入图像:一个是原始图像,另一个是旋转后的图像(我使用Windows的“旋转”命令进行旋转)。对于这两个图像,我获得的输出结果相同。我认为旋转图像实际上并没有改变其形状。我这么认为是因为当我试图将旋转后的图像放在此处时,预览仍显示未旋转的版本,所以我不得不对其进行屏幕截图,然后才能将其粘贴到此处。
以下是示例代码:
import cv2
import numpy as np
import sys
import os

image = cv2.imread("C:/img_8075.jpg")
print "image shape: ",image.shape
cv2.imshow("image",image)
cv2.waitKey(0)
image2 = cv2.imread("C:/img_8075_Rotated.jpg")
print "image shape: ",image2.shape
cv2.imshow("image",image2)
cv2.waitKey(0)

我得到的结果是: 图像形状: (406,610,3) 图像形状: (406,610,3) 对于这两张图片都是如此。
由于我刚刚加入,无法在这里粘贴输入/输出图片,因为它说您应该拥有“10个声望”的权限。有任何建议将非常有帮助。谢谢!

旋转图像后仍然保持相同的尺寸?你确定没有遗漏什么吗? - a-Jays
1
你是怎么发现尺寸被交换的?.cols应该是原始图像的宽度,.rows应该是原始图像的高度。如果不是这样的话,也许你的图像查看器在显示之前会内部旋转图像!? - Micka
嗨,Micka,我认为你说得对,我的图像查看器在显示之前内部旋转了图像。但是,我只想将这个旋转后的图像用作我的opencv(imread函数)的输入。我正在进行一个课程项目,从文件夹中读取图像以创建其组合图像。因此,有时候,文件夹中的图像方向不正确。所以,我会旋转它们(使用Windows右键单击->旋转右命令)。但是,opencv只读取原始图像。我该怎么办? - sm08
2个回答

4
我相信你只是把术语搞混了。OpenCV Mat结构可通过(ROW,COLUMN)进行访问。
因此,一张1920x1080的图片将由1080行和1920列组成(1080, 1920)。

你可以在这里找到更多关于它的信息:http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-mat - Nallath
嘿,我知道这不是关于规则的问题。这是关于读取使用“Windows->右键单击->向右/向左旋转”命令旋转过的图像的问题。我相信这种旋转只是为了查看目的而进行的,它并不会改变图像文件内部的形状。但是,我希望我的opencv函数能够读取旋转后的图像(因为其他的图像方向不正确)。我该怎么做? - sm08
为什么不在读入图像后直接在OpenCV中旋转它呢?http://opencvexamples.blogspot.com/2014/01/rotate-image.html#.VTcf6fnF_6M - CodyF
或者...您可以在您知道会更改底层位图的应用程序中旋转它们。例如MS Paint或GIMP。 - CodyF
哦,我现在明白你的意思了,你应该发布你的代码。我刚刚检查了一下,在Windows照片查看器中旋转图像似乎确实会旋转实际的图像。所以你不应该遇到你看到的问题... - CodyF
显示剩余4条评论

2

通常情况下,Mat.rows代表图像的高度,而Mat.cols代表图像的宽度。


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