第五章: OpenCV图形绘制综合实战-实现鼠标绘制基本图形
需要实现的效果:
通过鼠标拖拽实现图形的绘制,
可以画线, 当用户按下l键, 即选择了画线, 此时, 滑动鼠标即可画线;
可以画矩形, 当用户按下r键, 即选择了画矩形, 此时, 滑动鼠标即可画矩形;
可以画圆, 当用户按下c键, 即选择了画圆, 此时, 滑动鼠标即可画圆.
实战代码:
'''
要实现的基本功能:
可以画线, 当用户按下l键, 即选择了画线, 此时, 滑动鼠标即可画线;
可以画矩形, 当用户按下r键, 即选择了画矩形, 此时, 滑动鼠标即可画矩形;
可以画圆, 当用户按下c键, 即选择了画圆, 此时, 滑动鼠标即可画圆.
author: paul
'''
import cv2
import numpy as np
import pandas as pd
'''
param curshape:
0 - draw line
1 - draw rectangle
2 - draw circle
'''
curshape = 0
startpos = (0, 0)
img = np.zeros((480, 640, 3), np.uint8)
# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
# print(event, x, y, flags, userdata)
# event: 事件
'''
根据鼠标落下的事件获取起始点, 根据鼠标抬起的事件获取终止点.
'''
global curshape, startpos
if (event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN):
startpos = (x, y)
elif (event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP):
if curshape == 0:
cv2.line(img, startpos, (x, y), (0,0,255))
elif curshape == 1:
cv2.rectangle(img, startpos, (x, y), (0, 0, 255))
elif curshape == 2:
a = (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('draw_shape', cv2.WINDOW_NORMAL)
# 设置鼠标回调
cv2.setMouseCallback('draw_shape', mouse_callback)
# 显示窗口和背景
while True:
cv2.imshow('draw_shape', img)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('l'): # line
curshape = 0
elif key == ord('r'): # rectangle
curshape = 1
elif key == ord('c'): # circle
curshape = 2
cv2.destroyAllWindows()
小通知:
关于OpenCV的内容先更新到这里, 后续自己的重点会放在深度学习上, 尤其是基于tensorflow框架的一些网络模型的相关实现和应用.
最后祝大家元旦快乐, 2023年事事顺遂~