来自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()
答案 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