import numpy as np import cv2# 实现的功能 ########################## # 1. 画线:当用户按下l键,即选择了画线,此时,滑动鼠标可以画线。 # 2. 画矩形:当用户按下r键,即选择了画矩形,此时,滑动鼠标可以画矩形。 # 3. 画圆:当用户按下c键,即选择了画圆,此时,滑动鼠标可以画圆。 # ... ########################### 显示窗口 背景 img = np.zeros((480, 640, 3), np.uint8)# curshape:0代表画线,1代表画矩形,2代表画圆 curshape = 0 startpos = (0, 0)# 回调函数 def mouse_callback_func(event, x, y, flags, user_data):# event表示事件,x,y表示鼠标的当前位置坐标# 当按下鼠标左键时,记录绘图的初始位置# 当抬起鼠标左键时,当前x y的坐标为绘图的结束为止# 申明使用全局变量global startpos, curshape# 如果按下鼠标左键,则记录鼠标的位置坐标:startposif event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:startpos = (x, y)# 抬起鼠标时,绘图,elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:# 需要先判断按下的是那个键: l / r / c# curshape == 0 表示绘制直线if curshape == 0:cv2.line(img, startpos, (x, y), (0,0,255))# curshape == 1 表示绘制矩形elif curshape == 1:cv2.rectangle(img, startpos, (x, y), (0,0,255))# curshape == 2 表示绘制圆形elif curshape == 2:# 计算圆的半径 ra = x - startpos[0]b = y - startpos[1]r = int((a**2 + b**2)**0.5)cv2.circle(img, startpos, r, (0,0,255))else:print('Error: no shape')# 创建窗口 cv2.namedWindow('drawShape', cv2.WINDOW_NORMAL)# 设置鼠标回调 cv2.setMouseCallback('drawShape', mouse_callback_func, '123')while True:cv2.imshow('drawShape', img)key = cv2.waitKey(1) & 0xFFif key == ord('q'):breakelif key == ord('l'):curshape = 0elif key == ord('r'):curshape = 1elif key == ord('c'):curshape = 2cv2.destroyAllWindows()
