2

我有一个应用程序,我在其中裁剪图像的一部分并使用 Python 将它们保存在 OpenCv 4 中,在保存之前先绘制矩形(下面的 SSCCE)。有些图像非常大,因此在选择要裁剪的区域之前放大它们会很有帮助。

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

所以我的问题是,一旦我放大了,我怎么能从中得到:

手

回到这个:

指针

所以我可以回到放大图像上绘制矩形?我希望能够右键单击以返回指针(一些魔术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()
4

0 回答 0