写点什么

来,在图片上画个矩形吧,取经之旅第 14 天

发布于: 2021 年 03 月 30 日
来,在图片上画个矩形吧,取经之旅第 14 天

今天的学习的内容是:使用 Python OpenCV 实现拖动画图。


使用 OpenCV 画个矩形

要实现手动拖拽绘制图形,核心有两个步骤,第一步记录鼠标按下的点,第二步记录鼠标抬起的点,完成。


具体的说明写在代码中,下述代码最大的问题在绘制图片的时候,如果鼠标移动不规则,会出现一个弧线。


import cv2import 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'): breakcv2.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 cv2import 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'): breakcv2.destroyAllWindows()
复制代码



OpenCV 尾声


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


空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。


**想学 Python 爬虫,可以订阅橡皮擦专栏哦~** 🈲🈲🈲🈲 点击发现惊喜 🈲🈲🈲🈲




博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏


发布于: 2021 年 03 月 30 日阅读数: 11
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
来,在图片上画个矩形吧,取经之旅第 14 天