python进行OpenCV实战之画图(直线、矩形、圆形)


Posted in Python onAugust 27, 2020

前言

在上一节我们通过使用NumPy的数组分割成功的在我们的图像上画了一个绿色的方块,但是如果我们想画一个单一的线条或者圆圈该怎么办呢?NumPy没有提供相关的功能,但是OpenCV提供了相关的函数,在本节就将为大家介绍三个基本的OpenCV画图方法:

cv2.line() #1
cv2.rectangle() #2
cv2.circle() #3

1 画直线和矩形

在开始我们用OpenCV画我们的杰作之前,我们需要定义一个画布

import numpy as np #1
import cv2 #2

canvas = np.zeros((300, 300, 3), dtype="uint8") #3

#1-2:

关于所需包的导入

#3:

我们使用np.zeros()方法构造了一个300*300的NumPy数组,同时分配了三个颜色空间,分别表示Red,Green,Blue,正如zeros名字所描述的一样,这个方法用0填充了这个数组的每一个元素。在np.zeros()的第二个变量是数据类型:dtype。由于我们需要用RGB格式来表示我们的图像,它的取值范围是[0,255],所以我们用“uint8”就显得至关重要了,如果不声明的话np.zeros()默认的变量类型是float64.

1.1 画直线

green = (0, 255, 0) #4
cv2.line(canvas, (0, 0), (300, 300), green) #5
cv2.imshow("Canvas", canvas) #6
cv2.waitKey(0) #7

red = (0, 0, 255) #8
cv2.line(canvas, (300, 0), (0, 300), red, 3) #9
cv2.imshow("Canvas", canvas) #10
cv2.waitKey(0) #11

#4:

我们定义了一个元组来表示绿色

#5-7:

我们在canvas上画了一条绿线从坐标(0,0)到(300,300),将结果显示出来,并等待按下任意按键

#8:

我们定义了一个元组来表示红色,再次强调OpenCV是BGR模式而不是RGB模式

#9-11:

我们在canvas上画了一条红线从坐标(300,0)到(0,300),并且该线的线型为3个像素,这也是最后一个参数的含义,然后将结果显示出来,并等待按下任意按键

1.2 画矩形

cv2.rectangle(canvas, (10, 10), (60, 60), green) #12
cv2.imshow("Canvas", canvas) #13
cv2.waitKey(0) #14

cv2.rectangle(canvas, (50, 200), (200, 225), red, 5) #15
cv2.imshow("Canvas", canvas) #16
cv2.waitKey(0) #17

blue = (255, 0, 0) #18
cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1) #19
cv2.imshow("Canvas", canvas) #20
cv2.waitKey(0) #21

#12-14:

我们使用了cv2.rectangle()方法,这个方法与cv2.line()方法用法是一样的,第一个参数表示我们想要在canvas这个画布上进行画图,第二个参数是我们矩形的开始点(10,10),第三个参数是我们矩形的结束点(60,60),通过这两个点我们定义了一个50*50像素大小的区域,第四个参数是我们矩形边框的颜色——绿色,然后将结果显示出来,并等待按下任意按键。

#15-17:

在第15行代码中,正如我们可以控制话直线的线型粗细程度,我们也可以控制画矩形的线型粗细,在这行代码中最后一个参数“5”,则表示我们将在canvas上画出一个边框粗细为5个像素大小的起点为(50, 200),终点为 (200, 225)的红色矩形,然后将结果显示出来,并等待按下任意按键。

#18-21

到目前为止,我们画的都是图形的边框,如果我们想要填充这个边框怎么办呢?
在第19行代码中:

cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1) #19

我们画了一个起点为(200,50),终点为(225,125)的蓝色矩形,当我们将最后一个设置线型的参数设置为“-1”,我们便可以得到一个填充蓝色的矩形。

2 画圆形

画圆形和画直线和矩形是一样容易的,但是它有有一些不同:

2.1 同心圆

canvas = np.zeros((300, 300, 3), dtype="uint8") #22
(centerX, centerY) = (canvas.shape[1] // 2, canvas.shape[0] // 2) #23
white = (255, 255, 255) #24

for r in range(0, 175, 25): #25
 cv2.circle(canvas, (centerX, centerY), r, white) #26

cv2.imshow("Canvas", canvas) #27
cv2.waitKey(0) #28

for i in range(0, 25): #29
 radius = np.random.randint(5, high=200) #30
 color = np.random.randint(0, high=256, size=(3,)) #31

 pt = np.random.randint(0, high=300, size=(2,)) #32

 cv2.circle(canvas, tuple(pt), radius, color, 1) #33

cv2.imshow("Canvas", canvas) #34
cv2.waitKey(0) #35

#22:

我们重新将我们的画板变成一个白板

#23:

我们定义并计算一个中心点的坐标(centerX,centerY),在第1节和第2节我们均提到过shape[0]表示图片的高度,shape[1]表示图片的宽度,分别取它们的一半,得到centerY,centerX

#24:

定义一个白色的像素

#25-28:

我们从[0,175)的范围以跨度为25进行循环来取圆的半径,

cv2.circle(canvas, (centerX, centerY), r, white) #26

然后在第26行通过cv2.circle()来进行画圆,第一个参数表示在canvas上进行绘画,第二个参数表示圆心,第三个参数表示半径,第四个参数表示颜色。然后将结果显示出来,并等待按下任意按键。

2.2 随机圆

让我们来让圆多一点趣味:

for i in range(0, 25): #29
 radius = np.random.randint(5, high=200) #30
 color = np.random.randint(0, high=256, size=(3,)) #31

 pt = np.random.randint(0, high=300, size=(2,)) #32

 cv2.circle(canvas, tuple(pt), radius, color, -1) #33

cv2.imshow("Canvas", canvas) #34
cv2.waitKey(0) #35

#29:

通过循环表示,我们将画25个圆

#30-32:

如果要画圆,我们需要三个基本元素:圆的半径,圆的颜色,圆的圆心。在这里我们需要通过np.random.randint使用NumPy中产生随机数的能力。

radius = np.random.randint(5, high=200) #30

在第30行我们在[5,200)范围内产生随机数

color = np.random.randint(0, high=256, size=(3,)) #31

在第31行我们将在[0,256)范围内产生随机数,由于颜色值拥有3个通道值,我们通过size=(3,)让NumPy返回一个包含三个元素的列表。

pt = np.random.randint(0, high=300, size=(2,)) #32

在第32行我们将在[0,300)范围内产生随机数,我们通过size=(2,)让NumPy返回一个包含2个元素的列表来表示圆心。

#33:

cv2.circle(canvas, tuple(pt), radius, color, -1) #33

在第33行中,我们通过调用cv2.circle()方法来画圆,第一个参数表示在canvas上画圆,第二个参数圆心坐标需要注意必须是元组,所以使用tuple来进行强制转化列表,第三个参数是半径,第四个参数表示颜色,第5个参数为“-1”,表示产生实心圆。

#34-35:
将结果显示出来,并等待按下任意按键。

3 完整代码

新建drawing.py

import numpy as np
import cv2

canvas = np.zeros((300, 300, 3), dtype="uint8")
green = (0, 255, 0)
cv2.line(canvas, (0, 0), (300, 300), green)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

red = (0, 0, 255)
cv2.line(canvas, (300, 0), (0, 300), red, 3)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

cv2.rectangle(canvas, (10, 10), (60, 60), green)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

cv2.rectangle(canvas, (50, 200), (200, 225), red, 5)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

blue = (255, 0, 0)
cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

canvas = np.zeros((300, 300, 3), dtype="uint8")
(centerX, centerY) = (canvas.shape[1] // 2, canvas.shape[0] // 2)
white = (255, 255, 255)

for r in range(0, 175, 25):
 cv2.circle(canvas, (centerX, centerY), r, white)

cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

for i in range(0, 25):
 radius = np.random.randint(5, high=200)
 color = np.random.randint(0, high=256, size=(3,))

 pt = np.random.randint(0, high=300, size=(2,))

 cv2.circle(canvas, tuple(pt), radius, color, -1)

cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

4 效果展示

python进行OpenCV实战之画图(直线、矩形、圆形)

python进行OpenCV实战之画图(直线、矩形、圆形)

python进行OpenCV实战之画图(直线、矩形、圆形)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中zip()函数用法实例教程
Jul 31 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
python微信公众号之关键词自动回复
Jun 15 Python
python实现弹跳小球
May 13 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
python 实现字符串下标的输出功能
Feb 13 Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 Python
python json load json 数据后出现乱序的解决方案
Feb 27 Python
如何教少儿学习Python编程
Jul 10 Python
解析python 类方法、对象方法、静态方法
Aug 15 Python
python opencv实现简易画图板
Aug 27 #Python
python实现画图工具
Aug 27 #Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 #Python
基于python实现操作redis及消息队列
Aug 27 #Python
Python3如何在服务器打印资产信息
Aug 27 #Python
python 8种必备的gui库
Aug 27 #Python
Django静态文件加载失败解决方案
Aug 26 #Python
You might like
PHP时间戳使用实例代码
2008/06/07 PHP
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
基于python检查矩阵计算结果
2020/05/21 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
python爬虫基础之urllib的使用
2020/12/31 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
运动会闭幕式解说词
2014/02/21 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
500字小学生检讨书
2015/02/19 职场文书
小学生学习保证书
2015/02/26 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS