今天的学习的内容是:使用 Python OpenCV 实现拖动画图。
使用 OpenCV 画个矩形
要实现手动拖拽绘制图形,核心有两个步骤,第一步记录鼠标按下的点,第二步记录鼠标抬起的点,完成。
具体的说明写在代码中,下述代码最大的问题在绘制图片的时候,如果鼠标移动不规则,会出现一个弧线。
import cv2
import numpy as np
# 当鼠标按下时为 True,表示正在绘制
drawing = False
ix, iy = -1, -1
# 创建回调函数
def draw_rect(event, x, y, flags, param):
global ix, iy, drawing
# 当按下左键时返回起始位置坐标
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
# 当左键按下并移动时绘制图形,event 鼠标移动状态,flag 左键拖曳状态
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 200, 0), -1)
# 当鼠标松开时停止绘图
elif event == cv2.EVENT_LBUTTONUP:
drawing == False
# 下面把回调函数与 OpenCV 窗口绑定在一起
img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rect)
while(1):
cv2.imshow('image', img)
k = cv2.waitKey(1)
if k == ord('q'):
break
cv2.destroyAllWindows()
运行效果如下图所示:
在上面的代码中,还遇到一种函数需要学习下:
img = np.zeros((500, 500, 3), np.uint8)
对应的语法格式是:
zeros(shape, dtype=float, order='C')
该函数返回一个给定形状和类型的用0填充的数组;
参数说明
- shape:形状
- dtype:数据类型,可选参数,默认numpy.float64
- order:可选参数,C代表与C语言类似,行优先;F代表列优先
例如下述代码与返回内容:
print(np.zeros((2,5)))
运行结果:
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
对于上文中的代码,内容可以理解为:
dst = np.zeros((height, width, 3), np.uint8)
使用 OpenCV 画曲线
如果想要在鼠标拖动的时候画个圆形,只需要修改下面的代码即可。
cv2.circle(img,(x,y),3,(0,0,200),-1)
使用该方法可以绘制任意的曲线。
使用 OpenCV 画直线
修改绘制部分代码如下:
import cv2
import numpy as np
ix, iy = -1, -1
# 创建回调函数
def draw_rect(event, x, y, flags, param):
global ix, iy
# 当按下左键时返回起始位置坐标
if event == cv2.EVENT_LBUTTONDOWN:
ix, iy = x, y
elif event == cv2.EVENT_LBUTTONUP:
cv2.line(img, (ix, iy), (x, y), (0, 255, 0), 3)
print(np.zeros((500, 500, 3), np.uint8))
# 下面把回调函数与 OpenCV 窗口绑定在一起
img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rect)
while(1):
cv2.imshow('image', img)
k = cv2.waitKey(1)
if k == ord('q'):
break
cv2.destroyAllWindows()
OpenCV 尾声
1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?