重要的是逻辑!设置全局变量curshape判断要绘制什么图,和起始坐标startpos
1.在while死循环中不断获得curshape的值,如果按下对应按键,改变该值
2.将此值传入鼠标回调函数mouse_callback中,根据该值决定绘制不同图形,比如:curshape==1,则绘制矩形
import cv2
import numpy as np
# 实现功能:按下l键,进入绘制直线模式;按下r键,拖动鼠标可以绘制矩形;按下c键,拖动鼠标可以绘制圆形
# 这是一个全局标志,判断要画什么图
curshape = 0
startpos = (0, 0)
img = np.zeros((480, 640, 3), np.uint8)
def mouse_callback(event, x, y, flags, userdata):
# 引入全局变量
global curshape, startpos
# 如果需要引入非本层的局部变量用Nonlocal关键字
if event == cv2.EVENT_LBUTTONDOWN:
startpos = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
# 判断要画什么类型的图
if curshape == 0: # 画直线
cv2.line(img, startpos, (x, y), (0, 0, 255), 3)
elif curshape == 1: # 画矩形
cv2.rectangle(img, startpos, (x, y), (0, 0, 255), 3)
elif curshape == 2: # 画圆形
r = int(((x - startpos[0]) ** 2 + (y - startpos[1]) ** 2) ** 0.5) # 勾股定理获取半径
cv2.circle(img, startpos, r, (0, 0, 255), 3)
else: # 暂不支持其他按键
print('暂不支持绘制其他图形')
# 绘制窗口
cv2.namedWindow('drawshape', cv2.WINDOW_AUTOSIZE)
# 设置鼠标回调函数
cv2.setMouseCallback('drawshape', mouse_callback)
while True:
cv2.imshow('drawshape', img)
# 检测按键
key = cv2.waitKey(1)
if key == ord('q'):
break
elif key == ord('l'):
curshape = 0
elif key == ord('r'):
curshape = 1
elif key == ord('c'):
curshape = 2
cv2.destroyAllWindows()
其实实现的时候,有一个小瑕疵,只能通过鼠标左键的按下与抬起确认最终绘制图形的样子,没办法实时看出来想绘制图形的大小,类似于没有交互功能。
当然可以通过不断获取鼠标的位置来显示当前待绘制图形大小,但是结果肯定是出现无数个同心圆或者矩形,形成类似填充的效果。
opencv是不支持绘制完某一个图形后进行删除 *** 作的,有心的小伙伴可以试一下,完成后欢迎交流!
觉得有用的小伙伴点个赞加个关注支持一下吧!有错误或者不恰当的地方请指出!一起学习、进步!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)