为什么 cv2.resize 会调换所请求的尺寸?

use*_*956 6 python opencv opencv3.0

            s1 = image.shape  # Image is an opencv2 image (ndarray)
            w,h,d = s1
            image_ = cv2.resize(image, (w*2, h*2), interpolation = cv2.INTER_CUBIC)
            s2 = image_.shape
Run Code Online (Sandbox Code Playgroud)

在上面,我要求将输出大小调整为 (960,1280),但我得到 (1280, 960)。

那是怎么回事?

  image_ = cv2.resize(image, None, fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
Run Code Online (Sandbox Code Playgroud)

...按预期工作。(没有必要指出这一点)。

在此输入图像描述

可运行示例:

import cv2

def run():
    cap = cv2.VideoCapture(0)

    while cap.isOpened():
        success, image = cap.read()  # (480, 640, 3)
        if not success:
            print("Ignoring empty camera frame.")
            continue

        s1 = image.shape
        w, h, d = s1
        s2 = (w * 2, h * 2)
        image_ = cv2.resize(image, s2, interpolation=cv2.INTER_CUBIC)
        s3 = image_.shape
        cv2.imshow('Camera',
                   image_
                   )

        key = cv2.waitKey(5)
        if key & 0xFF == 27:
            break
    cap.release()


if __name__ == '__main__':
    run()

Run Code Online (Sandbox Code Playgroud)

ami*_*nrd 5

基于 OpenCV 文档:

img.shape 返回(高度、宽度、通道数),其中

  1. 高度表示图像中的像素行数或>图像数组的每列中的像素数
  2. 宽度表示图像中的像素列数或图像阵列的每行中的像素数。
  3. 通道数表示用于表示每个像素的分量的数量。

所以调整大小opencv应该像这样发生:

import cv2
 
cap = cv2.VideoCapture(0)
_, img = cap.read()
cap.release()
 
print('Original Dimensions : ',img.shape)
 
scale_percent = 60 # percent of original size
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
  
# resize image
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
Run Code Online (Sandbox Code Playgroud)

您的问题是关于为什么fx=2, fy=2根据此链接按预期工作,当没有给出所需的尺寸时,它会根据fxfy计算所需的尺寸来计算新尺寸:

  • FX:沿水平轴的比例因子。当它为0时,计算为(double)dsize.width/image.cols
  • FY:沿垂直轴的比例因子。当它为0时,计算为(double)dsize.height/image.rows

所需尺寸公式

总而言之,我想这是因为在OpenCVC++ 版本中,他们考虑了X水平方向(列)和Y垂直方向(行),因为CV2只是对这种不匹配的包装OpenCV-C++发生了考虑什么是第一个维度,什么是第二个维度就像我们在Numpy数组中一样。

更新 HansHirse 评论:

OpenCV是一个C++具有表示图像的专用cv::Mat类的库。并且,例如,对于某些cv::Mat图像,image.size返回一个cv::Size对象,该对象按顺序具有宽度和高度,使得几个OpenCV函数中的尺寸参数(宽度,高度)与之一致。Python APIOpenCV使用NumPy数组,默认情况下使用行优先顺序,这样对于某些 NumPy 数组图像,image.shape将按该顺序返回高度和宽度。这里这不是有意的设计选择。