在OpenCV中,缩放图像后,如何回到标准的鼠标光标?

2024-03-29 01:33:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,我裁剪图像的一部分,并使用Python将它们保存在opencv4中,在保存之前首先绘制矩形(下面是ssce)。有些图像非常大,所以在选择要裁剪的区域之前放大它们是很有帮助的。在

问题是,一旦你缩放了一个图像,鼠标光标就会永久地切换到交互式手上。然后单击/拖动只用于在窗口中转换图像的位置(除非我返回到全尺寸,但是我不能在放大的图像上绘制矩形)。在

所以我的问题是,一旦我放大,我如何从中得到:

hand

回到这里:

pointer

这样我就可以在放大的图像上画矩形了?我很乐意右键单击返回指针(一些神奇的cv2.EVENT_RBUTTONDOWN),但也许有一些内置的方法我只是不知道?在

有一点是可行的,当我改变我的程序,使它是按钮按下/释放绘制矩形,这样就不再有任何干扰本地左键单击导航。问题是我有箭的时候比有手的时候能画出更精确的矩形。所以,虽然这是一个我可以用来解决的方法,但如果我可以切换回箭头来绘制矩形,而放大。在

SSCE

import cv2
import numpy as np

#Insert your path to file here:
input_path = r'C:/image0000.bmp'
image = cv2.imread(input_path, cv2.IMREAD_GRAYSCALE)  
(im_h, im_w) = image.shape
max_d = np.max([im_h, im_w])
line_width = int(np.ceil(max_d/1000))
image_to_show = image.copy() # np.copy(image)
mouse_pressed = False
s_x = s_y = e_x = e_y = -1

def mouse_callback(event, x, y, flags, param):
    global image_to_show, s_x, s_y, e_x, e_y, mouse_pressed

    if event == cv2.EVENT_LBUTTONDOWN:
        mouse_pressed = True
        s_x, s_y = x, y
        image_to_show = np.copy(image)

    elif event == cv2.EVENT_MOUSEMOVE:
        if mouse_pressed:
            image_to_show = np.copy(image)
            cv2.rectangle(image_to_show, (s_x, s_y),
                          (x, y), (255, 255, 255), line_width)

    elif event == cv2.EVENT_LBUTTONUP:
        mouse_pressed = False
        e_x, e_y = x, y
        print(s_x, s_y, e_x, e_y)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('image', mouse_callback)
while True:
    cv2.imshow('image', image_to_show)
    k = cv2.waitKey(1)           
    if k == 27:
        break
cv2.destroyAllWindows()

Tags: topath图像imageeventshownp绘制