OpenCV和Python - 图像太大而无法显示

Zyn*_*ynk 32 python opencv image imshow

我的图像是6400×3200,而我的屏幕是1280 x 800.因此,图像需要调整大小才能显示.我正在使用Python和OpenCV 2.4.9.根据OpenCV文档,

如果需要显示大于屏幕分辨率的图像,则需要在imshow之前调用namedWindow("",WINDOW_NORMAL).

这就是我正在做的,但图像不适合屏幕,只显示一部分,因为它太大了.我也试过cv2.resizeWindow,但它没有任何区别.

import cv2
cv2.namedWindow("output", cv2.WINDOW_NORMAL)        # Create window with freedom of dimensions
# cv2.resizeWindow("output", 400, 300)              # Resize window to specified dimensions
im = cv2.imread("earth.jpg")                        # Read image
cv2.imshow("output", im)                            # Show image
cv2.waitKey(0)                                      # Display the image infinitely until any keypress
Run Code Online (Sandbox Code Playgroud)

Zyn*_*ynk 44

虽然我期待自动解决方案(自动适应屏幕),但调整大小也解决了问题.

import cv2
cv2.namedWindow("output", cv2.WINDOW_NORMAL)        # Create window with freedom of dimensions
im = cv2.imread("earth.jpg")                        # Read image
imS = cv2.resize(im, (960, 540))                    # Resize image
cv2.imshow("output", imS)                            # Show image
cv2.waitKey(0)                                      # Display the image infinitely until any keypress
Run Code Online (Sandbox Code Playgroud)

  • WINDOW_NORMAL 已经导致窗口可以调整大小。绝对不需要额外的调整大小调用。 (2认同)

nat*_*ncy 35

其他答案执行固定(width, height)调整大小。如果您想在保持纵横比的同时调整到特定大小,请使用此

def ResizeWithAspectRatio(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None
    (h, w) = image.shape[:2]

    if width is None and height is None:
        return image
    if width is None:
        r = height / float(h)
        dim = (int(w * r), height)
    else:
        r = width / float(w)
        dim = (width, int(h * r))

    return cv2.resize(image, dim, interpolation=inter)
Run Code Online (Sandbox Code Playgroud)

例子

image = cv2.imread('img.png')
resize = ResizeWithAspectRatio(image, width=1280) # Resize by width OR
# resize = ResizeWithAspectRatio(image, height=1280) # Resize by height 

cv2.imshow('resize', resize)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)


Cyr*_*rus 22

对我来说唯一resizeWindow有效的方法就是在imshow. 这是我正在使用的顺序:

# Create a Named Window
cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)

# Move it to (X,Y)
cv2.moveWindow(win_name, X, Y)
    
# Show the Image in the Window
cv2.imshow(win_name, image)
    
# Resize the Window
cv2.resizeWindow(win_name, width, height)
    
# Wait for <> miliseconds
cv2.waitKey(wait_time)
Run Code Online (Sandbox Code Playgroud)


Saq*_*eel 14

例如使用这个:

cv2.namedWindow('finalImg', cv2.WINDOW_NORMAL)
cv2.imshow("finalImg",finalImg)
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用:( (4认同)

Fra*_*sYL 10

在 OpenCV 中,cv2.namedWindow()只创建一个窗口对象,但不会调整原始图像的大小。您可以使用cv2.resize(img, resolution)来解决问题。

这是它显示的内容,一个 740 * 411 分辨率的图像。 原图

image = cv2.imread("740*411.jpg")
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

在这里,它在调整大小后显示 100 * 200 分辨率的图像。记住分辨率参数首先使用列然后是行。

调整大小后的图像

image = cv2.imread("740*411.jpg")
image = cv2.resize(image, (200, 100))
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

  • image == `[![link-to-image]][n]` 和 url= `[link](link)` (2认同)

Rhy*_*der 6

此代码将调整图像的大小,以便它可以保留其纵横比,并且只占用屏幕区域的指定部分。

它将根据您的屏幕尺寸和图像尺寸自动调整。

使用区域变量更改您希望图像能够占据的最大屏幕区域。该示例显示它以屏幕尺寸的四分之一显示。

import cv2
import tkinter as tk
from math import *

img = cv2.imread("test.jpg")
area = 0.25

h, w = img.shape[:2]
root = tk.Tk()
screen_h = root.winfo_screenheight()
screen_w = root.winfo_screenwidth()
vector = sqrt(area)
window_h = screen_h * vector
window_w = screen_w * vector

if h > window_h or w > window_w:
    if h / window_h >= w / window_w:
        multiplier = window_h / h
    else:
        multiplier = window_w / w
    img = cv2.resize(img, (0, 0), fx=multiplier, fy=multiplier)

cv2.imshow("output", img)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

我还制作了一个类似的函数,其中面积仍然是参数,但窗口高度和窗口宽度也是参数。

如果没有输入区域,那么它将使用您希望图像适合的窗口大小的定义高度和宽度(window_h,window_w)。

如果为所有参数都给出了输入,则优先考虑“区域”。

import cv2
import tkinter as tk
from math import *

def resize_image(img, area=0.0, window_h=0, window_w=0):
    h, w = img.shape[:2]
    root = tk.Tk()
    screen_h = root.winfo_screenheight()
    screen_w = root.winfo_screenwidth()

    if area != 0.0:
        vector = math.sqrt(area)
        window_h = screen_h * vector
        window_w = screen_w * vector

    if h > window_h or w > window_w:
        if h / window_h >= w / window_w:
            multiplier = window_h / h
        else:
            multiplier = window_w / w
        img = cv2.resize(img, (0, 0), fx=multiplier, fy=multiplier)

    return img

# using area
initial_image = cv2.imread("test.jpg")
resized_image = resize_image(initial_image, area=0.25))
cv2.imshow("output", resized_image)
cv2.waitKey(0)

# using window height and width
initial_image = cv2.imread("test.jpg")
resized_image = resize_image(initial_image, window_h = 480, window_w = 270))
cv2.imshow("output", resized_image)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)