python - 如何在opencv中保持图像窗口的纵横比?

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

最佳答案

您是要限制窗口 还是图像?您不能限制窗口大小,只能限制图像大小。

请注意,在 namedWindow 的文档中它在底部说

By default, flags == CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED

因此设置 cv2.WINDOW_KEEPRATIO 不会影响比率缩放(因为它默认不影响比率)。

我想您想要完成的是能够移动窗口大小并影响显示的图像大小。那是对的吗?如果是这样,那用 OpenCV 是不可能的,至少不是内置的。图像窗口只是显示您的图像 的容器,因此它们不会根本影响您的图像。当然,您可以在使用 cv2.resize() 显示之前调整图像大小。


编辑:好的,所以我什至不确定以上是否是您想要的,但我说过当前的 OpenCV 无法调整窗口大小。事实上,这是有可能的。您可以创建一个轨迹栏,它将在您的图像上放置一个 slider 。然后,当您移动 slider 时,它将调用您定义的以 slider 位置为参数的函数。然后您可以采用该位置,将其转​​换为 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()

关于python - 如何在opencv中保持图像窗口的纵横比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44388097/

相关文章:

python - 在 Flask 中渲染部分模板

python - 不支持 None 值,Keras LSTM 适合

opencv - 什么是最小打开cv版本,需要Rect对象绘制矩形

linux - 编译链接,警告找不到libpcre.so.1

image - [图像处理]阈值不能忽略透明像素

python - ConfigParser 从包含部分和小节的 INI 文件中获取值,如下所示

Python - 使用变量作为字符串格式化的一部分

python : Exiting for loop?

python - 如何使用python从ffmpeg管道输出?

opencv - cvReprojectImageTo3D 和 CV_32FC3 的问题