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中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python lambda表达式用法实例分析
Dec 25 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 Python
python 下载文件的几种方式分享
Apr 07 Python
python spilt()分隔字符串的实现示例
May 21 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 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
2006/12/14 PHP
PHP中设置时区方法小结
2012/06/03 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
jquery 弹出层实现代码
2009/10/30 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
python实现随机密码字典生成器示例
2014/04/09 Python
python threading模块操作多线程介绍
2015/04/08 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
银行内勤岗位职责
2014/04/09 职场文书
中秋寄语大全
2014/04/11 职场文书
法制宣传口号
2014/06/16 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
飞屋环游记观后感
2015/06/08 职场文书
信息简报范文
2015/07/21 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
Nginx四层负载均衡的配置指南
2021/06/11 Servers