Python:鼠标回调函数

mac2025-06-11  36

Python:鼠标回调函数

1. 鼠标回调函数缩放图片

1. 鼠标回调函数缩放图片

import cv2 class Param: def __init__(self, img): self.img = img self.scale = 0.8 self.src = cv2.resize(img, (int(img.shape[1] * self.scale), int(img.shape[0] * self.scale)), cv2.INTER_AREA) def lbuttondown(self, x, y): self.lmove_from = (x, y) print("-lbuttondown>", round(x / self.scale), round(y / self.scale)) def rbuttondown(self): print("->rbuttondown") def mousewheel(self, flags): self.scale += flags / abs(flags) / 50 if self.scale < 0.5: self.scale = 0.5 elif self.scale > 2: self.scale = 2 w = int(self.img.shape[1] * self.scale) h = int(self.img.shape[0] * self.scale) # 图像可以放大,窗口不能超过原图尺寸 self.src = cv2.resize(self.img, (w, h), cv2.INTER_AREA) #if w < int(img.shape[1]): #cv2.resizeWindow('ABC', w, h) # 图像尺寸(self.src.shape[1], self.src.shape[0])大于窗口尺寸(self.img.shape[1], self.img.shape[0]) else: src_cropped = self.src[0 : self.img.shape[1], 0 : self.img.shape[0]] cv2.imshow('ABC', src_cropped) def flag_lbutton(self, x, y): pass self.lmove_to = (x, y) move_vector = tuple(map(lambda x: x[0]-x[1], zip(self.lmove_to, self.lmove_from))) right_boundary = self.src.shape[1] - move_vector[1] top_boundary = self.src.shape[0] - move_vector[0] if right_boundary < 0: right_boundary = 0 elif right_boundary > self.src.shape[1] - self.img.shape[1]: right_boundary = self.src.shape[1] - self.img.shape[1] if top_boundary < 0: top_boundary = 0 elif top_boundary > self.src.shape[0] - self.img.shape[0]: top_boundary = self.src.shape[0] - self.img.shape[0] src_moved = self.src[right_boundary : (right_boundary + self.img.shape[1]), top_boundary : (top_boundary + self.img.shape[0])] print("->flag_lbutton:", move_vector) cv2.imshow('ABC', src_moved) def mouse(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: param.lbuttondown(x, y) elif event == cv2.EVENT_RBUTTONDOWN: param.rbuttondown() elif event == cv2.EVENT_MOUSEWHEEL: param.mousewheel(flags) elif flags == cv2.EVENT_FLAG_LBUTTON: param.flag_lbutton(x, y) if __name__ == '__main__': img = cv2.imread('1.jpg') param = Param(img) cv2.namedWindow('ABC', cv2.WINDOW_NORMAL) cv2.setMouseCallback('ABC', mouse, param) #cv2.imshow('ABC', param.src) cv2.waitKey(0) cv2.destroyAllWindows()
最新回复(0)