🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。
前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:OpenCV从入门到放弃 ,一个学习OpenCV的专栏~
专栏文章直链:
【OpenCV学习】绘制图形其二
【OpenCV学习】绘制图形其一
【OpenCV学习】Mat数据结构与图像通道的分割与融合
【OpenCV学习】OpenCV的色彩空间
【OpenCV学习】初识OpenCV其二
【OpenCV学习】初识OpenCV
需求
需要一个绘画板,要求如下:
键盘操作 | 鼠标操作 | 效果 |
---|---|---|
q | - | 退出程序 |
l | - | 切换绘画方式为画直线 |
r | - | 切换绘画方式为画矩形 |
c | - | 切换绘画方式为画圆 |
- | 左键按下 | 设置为起始点 |
- | 左键抬起 | 设置为终点(圆为半径) |
效果图
分析
经过之前的学习,我们知道 cv2.waitKey(1)
可以返回按下的按键的ASCII码,所以这四个键盘操作可以通过这个函数获取到,放在主函数循环中,就能切换绘画方式了;
然后鼠标回调函数 mouse_callback(event, x, y, flags, userdata)
中的 event
获取到事件,来判断我们的鼠标是左键按下还是左键抬起。
参考代码
import numpy as np
from cv2 import cv2
start_pos = (0, 0)
action = 0 # 0为画直线,1为画矩形,2为画圆
cv2.namedWindow('draw')
img = np.full((400, 400, 3), 0, np.uint8)
cv2.imshow('draw', img)
def mouse_callback(event, x, y, flags, userdata):
global start_pos
if event == cv2.EVENT_LBUTTONDOWN:
start_pos = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
if action == 0:
cv2.line(img, start_pos, (x, y), (0, 0, 255), 3)
elif action == 1:
cv2.rectangle(img, start_pos, (x, y), (0, 0, 255), 3)
elif action == 2:
cv2.circle(img, start_pos, int(((start_pos[0] - x) ** 2 + (start_pos[1] - y) ** 2) ** 0.5), (0, 0, 255), 3)
cv2.imshow('draw', img)
cv2.setMouseCallback('draw', mouse_callback)
while 1:
key = cv2.waitKey(1)
if key == ord('q'):
break
elif key == ord('l'):
action = 0
elif key == ord('r'):
action = 1
elif key == ord('c'):
action = 2
cv2.destroyAllWindows()