gpt4 book ai didi

python - 为什么 cv2.resize 转置请求的尺寸?

转载 作者:行者123 更新时间:2023-12-04 07:43:42 28 4
gpt4 key购买 nike

            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
在上面,我要求输出调整到 (960,1280),但我得到 (1280, 960)。
那是怎么回事?
  image_ = cv2.resize(image, None, fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
...按预期工作。 (没有指出这一点的要点)。
enter image description here
可运行示例:
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()

最佳答案

基于 OpenCV 文档:

img.shape returns (Height, Width, Number of Channels)where

  1. Height represents the number of pixel rows in the image or the number of pixels in > each column of the image array
  2. Width represents the number of pixel columns in the image or the number of pixels in each row of the image array.
  3. Number of Channels represents the number of components used to represent each pixel.

所以在 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)
你的问题是为什么 fx=2, fy=2基于 this link,按预期工作, 如果没有给出所需的尺寸,它会根据 fx 计算新尺寸和 fy计算所需的 dsize:
  • FX:沿水平轴的比例因子。为0时,计算为(double)dsize.width/image.cols
  • FY:沿垂直轴的比例因子。为0时,计算为(double)dsize.height/image.rows

  • Desired_size_formula
    总结一下,我想那是因为在 OpenCV C++版本,他们考虑过 X在水平方向(列)和 Y在垂直方向(行)和自 CV2只是一个包装 OpenCV-C++发生这种不匹配是因为我们在 Numpy 中考虑了什么是第一维,什么是第二维。数组。
    更新
    HansHirse 评论: OpenCVC++图书馆有专用 cv::Mat表示图像的类。并且,例如,对于某些 cv::Mat图像, image.size返回 cv::Size对象,其具有宽度和高度的顺序,使得尺寸参数(宽度,高度)在几个 OpenCV功能与此一致。 OpenCV的Python API用途 NumPy数组,默认情况下使用行优先顺序,例如对于某些 NumPy 数组图像, image.shape将按该顺序返回高度和宽度。这不是有意的设计选择。

    关于python - 为什么 cv2.resize 转置请求的尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67309220/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com