如何调整从 cv2.imshow() 获得的 window 的大小?

How to resize the window obtained from cv2.imshow()?

我今天开始学习 OpenCV,我写了一个简短的代码来上传(我不知道,如果它是正确的术语)随机图像:

它工作正常,我可以打开图像,但是我得到的是一个很大的图像 window,除非我滚动它,否则我看不到完整的图像:

所以,我想知道一种方法,可以让我在更短的时间内看到整个图像的漂亮和精细 window。

您可以在保持纵横比不变的情况下调整图像大小并显示它。

#Display image
def display(img, frameName="OpenCV Image"):
    h, w = img.shape[0:2]
    neww = 800
    newh = int(neww*(h/w))
    img = cv2.resize(img, (neww, newh))
    cv2.imshow(frameName, img)
    cv2.waitKey(0)

实际的"problem"来自imshow本身,如下:

If the window was not created before this function, it is assumed creating a window with cv::WINDOW_AUTOSIZE.

查看 WindowFlags 文档页面的相应描述,我们得到:

the user cannot resize the window, the size is constrainted by the image displayed.

因此,要解决此问题,您必须使用 namedWindow, and then resize it accordingly using resizeWindow.

手动设置 window

让我们看看这段代码:

import cv2

# Read image
image = cv2.imread('path/to/your/image.png')

# Window from plain imshow() command
cv2.imshow('Window from plain imshow()', image)

# Custom window
cv2.namedWindow('custom window', cv2.WINDOW_KEEPRATIO)
cv2.imshow('custom window', image)
cv2.resizeWindow('custom window', 200, 200)

cv2.waitKey(0)
cv2.destroyAllWindows()

示例输出如下所示(原始图像大小为 [400, 400]):

使用 cv2.WINDOW_KEEPRATIO,图像始终适合 window,如果需要,您可以手动调整 window 的大小。

希望对您有所帮助!

cv2.imshow() 创建一个新的 window 时,它传递标志 cv::WINDOW_AUTOSIZE,防止调整大小。

调整已经存在的 window 的大小,您必须禁用此标志:

import cv2
import numpy as np

if __name__ == '__main__':
    cv2.imshow('image', np.ones((128, 128, 3)))
    cv2.setWindowProperty('image', 1, cv2.WINDOW_NORMAL)
    cv2.waitKey()
    cv2.resizeWindow('image', 512, 512)
    cv2.waitKey()
    exit()

之前

之后