如何在OpenCV中保持图像窗口的纵横比?

6
根据文档,我们可以使用CV_WINDOW_KEEPRATIO来保持图像的比例,但是在我调整之后,窗口仍然失去了宽高比。请问有谁能帮忙解决吗?
示例代码:
import cv2

# load the image, clone it, and setup the mouse callback function
image = cv2.imread('1.jpg')
cv2.namedWindow('image', cv2.WINDOW_KEEPRATIO)
# keep looping until the 'q' key is pressed
while True:
    # display the image and wait for a keypress
    cv2.imshow('image', image)
    key = cv2.waitKey()

    if key == 27:
        break

# close all open windows
cv2.destroyAllWindows()
2个回答

3
你是想限制窗口大小还是图片大小?你只能限制图片大小,而不能限制窗口大小。
请注意,在namedWindow的文档中,在底部有如下说明:
默认情况下,flags == CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED 因此,设置cv2.WINDOW_KEEPRATIO不会影响比例缩放(因为默认情况下它不影响比例)。
我想你想要实现的是调整窗口大小并影响显示的图像大小。是吗?如果是这样,那就无法在OpenCV中实现,至少没有内置的功能。图像窗口只是用来显示图像的容器,因此它们不会对图像产生任何影响。当然,在显示之前,您可以使用cv2.resize()调整您的图像大小。
编辑:好吧,我甚至不确定上面的内容是否是你想要的,但我说当前OpenCV不支持调整窗口大小。事实上,它有点可能。您可以创建一个滑块,将滑块放在图像上。然后,当您移动滑块时,它会调用您定义的带有滑块位置作为参数的函数。然后,您可以将该位置转换为介于0和1之间的数字,然后乘以该数字来获得较小的图像大小。然后,您可以按比例缩放您的图像,并将其重新显示到您的窗口中。我非常确定这对您所需要的远远超出了范围,但它很有趣,所以我决定尝试一下。
import cv2

def trackbar_change(pos):
    pos = pos/100 # get a scaling factor from trackbar pos
    image = cv2.imread('image.jpg') # read image
    h = int(image.shape[0]*pos) # scale h
    w = int(image.shape[1]*pos) # scale w
    rsz_image = cv2.resize(image, (w, h)) # resize image
    cv2.resizeWindow('image_window', w, h) # resize window
    cv2.imshow('image_window', rsz_image) # display resized image
    return

image = cv2.imread('image.jpg')
cv2.namedWindow('image_window', cv2.WINDOW_NORMAL)
starting_trackbar_val = 100
quant_trackbar_vals = 100
cv2.createTrackbar('Image scale', 'image_window', \
    starting_trackbar_val, quant_trackbar_vals, trackbar_change)

cv2.imshow('image_window', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

我对我的解释含糊不清感到抱歉。我的目标是创建一个可调整大小的窗口,用于显示像这样的图像,但同时也要考虑保持宽高比。使用cv2.namedWindow('image', cv2.WINDOW_KEEPRATIO),我可以创建一个可调整大小的窗口,但无法保持宽高比。 - kai06046
2
除非您使用类似于我发布的解决方案的方法,否则在OpenCV中无法执行此操作。您无法控制窗口大小的各个方面,除非实际上在代码中编写尺寸并重新显示窗口,就像我展示的那样。 OpenCV与操作系统的交互非常有限,这是其交互受限的结果。 - alkasm

0

这可能是显示本身的问题。比如说你的显示窗口默认就很大。在上面的代码片段中,我没有看到任何对纵横比进行的更改。在这里检查一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接