前言

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

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

1 画直线和矩形

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

import numpy as np #1
import cv2 #2canvas = 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) #7red = (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) #14cv2.rectangle(canvas, (50, 200), (200, 225), red, 5) #15
cv2.imshow("Canvas", canvas) #16
cv2.waitKey(0) #17blue = (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) #24for r in range(0, 175, 25):   #25cv2.circle(canvas, (centerX, centerY), r, white)  #26cv2.imshow("Canvas", canvas) #27
cv2.waitKey(0)  #28for i in range(0, 25):  #29radius = np.random.randint(5, high=200)  #30color = np.random.randint(0, high=256, size=(3,))  #31pt = np.random.randint(0, high=300, size=(2,)) #32cv2.circle(canvas, tuple(pt), radius, color, 1) #33cv2.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): #29radius = np.random.randint(5, high=200) #30color = np.random.randint(0, high=256, size=(3,)) #31pt = np.random.randint(0, high=300, size=(2,)) #32cv2.circle(canvas, tuple(pt), radius, color, -1) #33cv2.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 cv2canvas = 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 效果展示




转载请注明出处:
CSDN:楼上小宇__home:http://blog.csdn.net/sty945
简书:楼上小宇:http://www.jianshu.com/u/1621b29625df

3 用python进行OpenCV实战之画图(直线,矩形,圆形)相关推荐

  1. OpenCV实战系列——拟合直线

    OpenCV实战--拟合直线 0. 前言 1. 直线拟合 2. 完整代码 相关链接 0. 前言 在某些计算机视觉应用中,不仅要检测图像中的线条,还要准确估计线条的位置和方向.本节将介绍如何找到最适合给 ...

  2. 2 用python进行OpenCV实战之图像基本知识

    前言 在这一节,我们将学习图像的基本构成单元--像素,我们将详细的探讨什么是像素?像素是如何使用来构成图像的?然后学习如何通过OpenCV来获取和操纵像素. 1 什么是像素 所有的图像都包含一组像素, ...

  3. 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存

    code 将下面文档存为load_display_save.py #-*- coding:utf-8 -*- from __future__ import print_function #1 impo ...

  4. 4 用python进行OpenCV实战之图像变换1(平移)

    前言 到目前为止,经过前几节的介绍,我们已经有了一个坚实的基础去做一些图像处理,在本节我们先将介绍图像变换中的平移,为后面几节学习图像变换中的旋转.改变大小.镜像.裁剪打下一个好的基础 1 平移 1. ...

  5. python用opencv实现图片的移入移出,4 用python进行OpenCV实战之图像变换1(平移)

    前言 到目前为止,经过前几节的介绍,我们已经有了一个坚实的基础去做一些图像处理,在本节我们先将介绍图像变换中的平移,为后面几节学习图像变换中的旋转.改变大小.镜像.裁剪打下一个好的基础 1 平移 1. ...

  6. 5 用python进行OpenCV实战之图像变换2(旋转)

    前言 最近有些其他事情,一周未更新了,实在抱歉.以后争取,每周多更新几次.虽然也不知道能有多少人看到,但是也算自己的一种坚持吧! 1 旋转 1.1 旋转基本操作 旋转的概念正如我们平常听见的一样:将图 ...

  7. python 使用opencv在图片上绘制矩形、圆形以及中英文

    最近看了下python的第三方库opencv,在python中用来对图片进行一些简单处理还是非常好用的,比如在图形上画矩形框,圆框,指示线,椭圆以及文字等,只需要调用几个相应的函数,设置好起止坐标点以 ...

  8. 实战:使用 Python 和 OpenCV 创建自己的“CamScanner”

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小伙伴们有没有想过"CamScanner"如何 ...

  9. 重磅升级,52个Python+OpenCV实战项目教你掌握图像处理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

最新文章

  1. SPI 的主模式和从模式
  2. Axel与Wget下载工具
  3. (pytorch-深度学习系列)使用softmax回归实现对Fashion-MNIST数据集进行分类-学习笔记
  4. bash error 环境变量错误
  5. 【报告分享】快手、抖音、视频号对比,竞争趋紧,运营体系成关键.pdf(附下载链接)...
  6. 异常总结2013-04
  7. 数据安全--安全网关
  8. 机器学习实例—手写体识别
  9. 影子系统 是怎么一回事!-间歇博客
  10. kali linux无线驱动安装,Kali Linux安装 WIFI无线网卡驱动 教程
  11. Kafka同步发送与异步发送消息
  12. 金融小知识 | Fama-Macbeth回归
  13. 安装了多个java 如何切换java版本
  14. 2020届IC企业校招部分笔试题
  15. ICC学习——LAB0A
  16. win10下MySQL无法运行问题
  17. 计算机学什专业,计算机专业到底学什么?
  18. fine-grained和coarse-grained理解
  19. java计算机毕业设计基于安卓Android的音乐论坛APP(源码+系统+mysql数据库+Lw文档)
  20. p12解析流程_解析p12格式的程序(提取公钥和私钥)

热门文章

  1. 2022-2028年中国小球产业深度调研及投资前景预测报告(全卷)
  2. Go 学习笔记(76)— Go 标准库 net/http 创建客户端(发送 GET、POST 请求)
  3. 浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS
  4. Python 标准库之 time
  5. Ascend Pytorch算子功能验证
  6. CodeGen结构循环回路
  7. CodeGen API分析
  8. YOLOv4实用训练实践
  9. 人工智能:深层神经网络
  10. AttributeError: ‘NoneType‘ object has no attribute ‘span‘