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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
python批量生成本地ip地址的方法
Mar 23 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
Django与JS交互的示例代码
Aug 23 Python
Python实现购物车功能的方法分析
Nov 10 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
windows支持哪个版本的python
Jul 03 Python
Python装饰器如何实现修复过程解析
Sep 05 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
Egret引擎开发指南之发布项目
2014/09/03 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
详解React 条件渲染
2020/07/08 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
用实例解释Python中的继承和多态的概念
2015/04/27 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
基于Python正确读取资源文件
2020/09/14 Python
意大利在线药房:Saninforma
2021/02/11 全球购物
学雷锋宣传标语
2014/06/25 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
春节慰问简报
2015/07/21 职场文书
如何撰写促销方案?
2019/07/05 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
分享几种python 变量合并方法
2022/03/20 Python