OpenCV&;Python-图像太大,无法显示

OpenCV&;Python-图像太大,无法显示,python,image,opencv,image-processing,imshow,Python,Image,Opencv,Image Processing,Imshow,我有一张6400的图像 × 3200,而我的屏幕是1280x800。因此,只需调整图像的大小以供显示。我正在使用Python和OpenCV 2.4.9。 根据, 如果需要显示大于屏幕分辨率的图像,则需要在imshow之前调用namedWindow(“,WINDOW_NORMAL”) 这就是我正在做的,但是图像不适合屏幕,只显示了一部分,因为它太大了。我也尝试过cv2.resizeWindow,但没有任何区别 import cv2 cv2.namedWindow("output", cv2.WIN

我有一张6400的图像 × 3200,而我的屏幕是1280x800。因此,只需调整图像的大小以供显示。我正在使用Python和OpenCV 2.4.9。 根据,

如果需要显示大于屏幕分辨率的图像,则需要在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

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

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
在opencv中,cv.namedWindow()只根据您的决定创建一个窗口对象,而不调整原始图像的大小。您可以使用cv2.resize(img,resolution)来解决这个问题

这是它显示的,740*411分辨率的图像。

在这里,它在调整大小后显示100*200分辨率的图像。请记住分辨率参数use column first is row

试试这个:

image = cv2.imread("img/Demo.jpg")
image = cv2.resize(image,(240,240))

图像的大小现在已调整。显示它将以240x240呈现。

其他答案执行固定的
(宽度、高度)
调整大小。如果要在保持纵横比的同时将大小调整为特定大小,请使用此选项

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)
范例

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()
请尝试使用以下代码:

from PIL import Image

Image.fromarray(image).show()
例如:

cv2.namedWindow('finalImg', cv2.WINDOW_NORMAL)
cv2.imshow("finalImg",finalImg)

看起来opencv库对传递给方法的参数非常敏感。以下代码使用opencv 4.3.0为我工作:

win_name = "visualization"  #  1. use var to specify window name everywhere
cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)  #  2. use 'normal' flag
img = cv2.imread(filename)
h,w = img.shape[:2]  #  suits for image containing any amount of channels
h = int(h / resize_factor)  #  one must compute beforehand
w = int(w / resize_factor)  #  and convert to INT
cv2.resizeWindow(win_name, w, h)  #  use variables defined/computed BEFOREHAND
cv2.imshow(win_name, img)

对我来说,
resizeWindow
唯一有效的方法就是在
inshow
之后使用它。这是我使用的顺序:

# 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)
#创建命名窗口
cv2.namedWindow(win\u name,cv2.WINDOW\u NORMAL)
#将其移动到(X,Y)
cv2.moveWindow(win_名称,X,Y)
#在窗口中显示图像
cv2.imshow(win_名称、图像)
#调整窗口大小
cv2.调整窗口大小(窗口名称、宽度、高度)
#等几秒钟
cv2.等待键(等待时间)

cv2.WINDOW\u正常选项工作正常,但第一次以标准尺寸显示窗口时

如果像计算机中的任何其他窗口一样调整窗口大小,请将鼠标放在要调整大小的窗口边缘上,然后将鼠标拖动到所需位置。如果执行此操作,请将窗口的宽度和高度调整为您想要获得的大小


在以下刷新窗口的时间,通过执行代码,OpenCV将生成具有上次显示或修改窗口大小的窗口。

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

它将根据您的屏幕大小和图像大小自动调整

使用area变量更改您希望图像能够占据的最大屏幕面积。该示例显示它以屏幕大小的四分之一显示

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)
我还做了一个类似的函数,其中面积仍然是一个参数,但窗高和窗宽也是

如果未输入任何区域,则将使用您希望图像适合的窗口大小的定义高度和宽度(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)

您应该能够通过将光标指向窗口边框来调整图像窗口的大小谢谢您的回复,但当我这样做时,它会调整窗口的大小,但不会调整图像的大小(图像未完全显示)。即使它能工作,但仍然不理想,因为我必须多次拖动边框才能将其安装到屏幕上,而且这也是为了从网络摄像头中连续读取,我不希望用户手动调整窗口大小。然后只需将显示的图像调整到所需的尺寸。谢谢,@Miki,我决定这样做。我以前没有这样做过,因为OpenCV文档声称它可以像我提供的链接一样自动适应屏幕,但这并没有发生,这正是我想要解决的问题。但我想,调整大小也很好。我想你应该做一些事情,比如是的,我的错误,我的代码中有正确的大小,但不是在这里。谢谢大家,请使用post表单中的格式化工具,使您的帖子更具可读性。图像应作为图像而不是文件上载link@Prateek您好,我试图在我的帖子中插入图像,但它似乎总是带有链接而不是图像。image=
[![link to image]][n]
和url=
[link](link)
明白了。非常感谢这已经在已接受的答案中,我不明白您为什么将其添加为新答案?我认为用户不想调整实际图像的大小,而是要调整显示窗口的大小。请详细解释。我试图更好地解释它,如果您现在理解了,请确认我。:)
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)
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)