今天的学习的内容是:使用 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()

运行效果如下图所示:

python在图片上上画线 python在图片上画矩形_数据分析


在上面的代码中,还遇到一种函数需要学习下:

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)

使用该方法可以绘制任意的曲线。

python在图片上上画线 python在图片上画矩形_python_02

使用 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()

python在图片上上画线 python在图片上画矩形_数据分析_03

OpenCV 尾声

1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?