如何在opencv中保持图像窗口的宽高比?

时间:2017-06-06 10:54:55

标签: python opencv

来自documantation,它表示我们可以通过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 个答案:

答案 0 :(得分:2)

您是否正在尝试约束窗口图像?您不能限制窗口大小,只能限制图像大小。

请注意,在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()

答案 1 :(得分:0)

这可能是显示器本身的问题。显示窗口默认为大。在上面的代码片段中,我没有看到任何宽高比的变化。查看here