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 切片和range()用法说明
Mar 24 Python
Python操作json数据的一个简单例子
Apr 17 Python
Windows下PyMongo下载及安装教程
Apr 27 Python
python2与python3共存问题的解决方法
Sep 18 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
Python3合并两个有序数组代码实例
Aug 11 Python
Python selenium如何打包静态网页并下载
Aug 12 Python
python如何实现word批量转HTML
Sep 30 Python
使用python如何删除同一文件夹下相似的图片
May 07 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中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
js导入导出excel(实例代码)
2013/11/25 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
vue 组件中slot插口的具体用法
2018/04/03 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
Python抽象类的新写法
2015/06/18 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
浅谈python标准库--functools.partial
2019/03/13 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
python 初始化一个定长的数组实例
2019/12/02 Python
Django封装交互接口代码
2020/07/12 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
汽车维修专业个人求职信范文
2014/01/01 职场文书
自动化毕业生专业自荐书范文
2014/02/04 职场文书
公司员工活动策划方案
2014/08/20 职场文书
采购内勤岗位职责
2015/04/13 职场文书