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

举报
梦想橡皮擦 发表于 2021/03/26 01:18:22 2021/03/26
【摘要】 今天的学习的内容是:使用 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

运行效果如下图所示:

来,在图片上画个矩形吧,取经之旅第 14 天
在上面的代码中,还遇到一种函数需要学习下:

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

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

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

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

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

OpenCV 尾声

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

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

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

今天是持续写作的第 49 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


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

文章来源: blog.csdn.net,作者:梦想橡皮擦,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/hihell/article/details/112392786

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。