来,在图片上画个矩形吧,取经之旅第 14 天
【摘要】 今天的学习的内容是:使用 Python OpenCV 实现拖动画图。
使用 OpenCV 画个矩形
要实现手动拖拽绘制图形,核心有两个步骤,第一步记录鼠标按下的点,第二步记录鼠标抬起的点,完成。
具体的说明写在代码中,下述代码最大的问题在绘制图片的时候,如果鼠标移动不规则,会出现一个弧线。
import cv2
import numpy as np
# 当鼠标...
今天的学习的内容是:使用 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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
运行效果如下图所示:
在上面的代码中,还遇到一种函数需要学习下:
img = np.zeros((500, 500, 3), np.uint8)
- 1
对应的语法格式是:
zeros(shape, dtype=float, order='C')
- 1
该函数返回一个给定形状和类型的用0填充的数组;
参数说明
- shape:形状
- dtype:数据类型,可选参数,默认numpy.float64
- order:可选参数,C代表与C语言类似,行优先;F代表列优先
例如下述代码与返回内容:
print(np.zeros((2,5)))
- 1
运行结果:
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
- 1
- 2
对于上文中的代码,内容可以理解为:
dst = np.zeros((height, width, 3), np.uint8)
- 1
使用 OpenCV 画曲线
如果想要在鼠标拖动的时候画个圆形,只需要修改下面的代码即可。
cv2.circle(img,(x,y),3,(0,0,200),-1)
- 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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
OpenCV 尾声
1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?
空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。
想学 Python 爬虫,可以订阅橡皮擦专栏哦~
🈲🈲🈲🈲 点击发现惊喜 🈲🈲🈲🈲
今天是持续写作的第 49 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。
博主 ID:
梦想橡皮擦
,希望大家点赞、评论、收藏
文章来源: blog.csdn.net,作者:梦想橡皮擦,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/hihell/article/details/112392786
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)