【问题标题】:How to resize the window obtained from cv2.imshow()?如何调整从 cv2.imshow() 获得的窗口大小?
【发布时间】:2019-10-16 02:59:22
【问题描述】:

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

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

所以,我想知道一种方法,我可以在更短的窗口中漂亮地看到整个图像。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请考虑taking the tour,并在此处阅读how to ask(好)问题。社区要求您不要发布代码图片,而是将其作为文本复制到您的实际问题中。

标签: python-3.x numpy opencv image-manipulation


【解决方案1】:

实际的“问题”来自imshow 本身,具体如下:

如果在这个函数之前没有创建窗口,则假定创建一个带有cv::WINDOW_AUTOSIZE的窗口。

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

用户无法调整窗口大小,大小受显示图像的限制。

因此,要解决此问题,您必须使用namedWindow 手动设置窗口,然后使用resizeWindow 相应地调整其大小。

让我们看看这段代码sn-p:

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,图像始终适合窗口,如果需要,您可以手动调整窗口大小。

希望有帮助!

【讨论】:

【解决方案2】:

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

#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)

【讨论】:

  • 从我的角度来看,这个解决方案有缺点(一般来说,可能不是在这种特定情况下),如果显示图像只是为了进行一些视觉检查,和/但图像实际上是进一步处理,如果仅出于可视化目的而将其缩小,则可能会丢失“精度”或“信息”。而且,创建/传递图像的副本会增加内存使用量(同样:通常可能是一个问题,这里不是强制性的)。
【解决方案3】:

cv2.imshow() 创建一个新窗口时,它会传递标志cv::WINDOW_AUTOSIZE,从而阻止调整大小。

调整现有窗口的大小,您必须取消此标志:

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()

之前

之后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2021-07-25
    • 2012-04-03
    • 2015-01-22
    • 2023-03-24
    • 2020-01-16
    • 2014-01-01
    相关资源
    最近更新 更多