绘画
在之前的计算机视觉:三、图像基础中介绍了如何在一幅图像中画一个蓝色的矩形,那么如果我们如果想画一条直线,一个圆呢?我们应该如何进行呢?我们就不能再用NumPy来操作了,而是用OpenCV
本文将展示如何利用openCV库来画直线、矩形和圆。
直线
接下来的所有操作都将再会一副我们自己定义的画布上进行,我们可以利用NumPy数组自己定义一个画布(图像),因为openCV将一副图片解释为一个NumPy,所以我们没理由不能通过定义数组的方式来创造一副图像。
新建draw.py文件,写入如下代码
import cv2
import numpy as np
canvas = np.zeros((300, 300), np.uint8)
cv2.imshow("canvas", canvas)
cv2.waitKey(0)
执行draw.py,结果如下。
可以看到我们用np.zeros()
方法生成了一个大小为300✖️300✖️3的矩阵,其中每一个像素的值都是0,每个像素都通过8位无符号整数(np.uint8)来表示。而像素值为0则对应着黑色,所以我们生成了一张300✖️300的全黑色图像。
这里需要说明,像素的值我们一般都会用8位无符号数据类型来表示,但是这也有一些问题,无符号整数只能用来表示整数,因为其没有符号位,而当我们需要表示一个负数的时候,我们则需要用浮点数来表示,这点后面遇到的时候在做说明。
现在让我们画一条直线吧。
这里我们需要调用cv2.line
方法:
cv2.line(image,startPoint,endPoint,color,thickness)
image
:这条直线画在的那幅图像
startPoint
:一个坐标元组,表示直线的起点
endPoint
:一个坐标元组,表示直线的终点
color
:一个色彩元组,表示直线的颜色【要注意openCV表示颜色的方式(b,g,r)】
thickness
:整数,表示直线的宽度,可以不填。
import cv2
import numpy as np
canvas = np.zeros((300, 300, 3), np.uint8)
green = (0, 255, 0)
cv2.line(canvas, (0,0), (300, 300), green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
上面几行代码,定义了一条从点(0,0)到点(300,300)的绿色直线
执行效果如下,可以看到一条绿色细直线平分了整个画布,一条红色的粗直线横向贯穿了整个画布
画一条直线看起来非常的简单,那么如果我们要画一个矩形呢?
现在让我们画一个矩形吧。
这里我们需要调用cv2.rectangle
方法:
cv2.rectangle(image,startPoint,endPoint,color,thickness)
image
:这个矩形画在的那幅图像
startPoint
:一个坐标元组,表示矩形的起点
endPoint
:一个坐标元组,表示矩形的终点
color
:一个色彩元组,表示矩形的颜色【要注意openCV表示颜色的方式(b,g,r)】
thickness
:整数,表示矩形直线的宽度,可以不填;为负数时表示填充整个矩形。
上代码:
import cv2
import numpy as np
canvas = np.zeros((300, 300, 3), np.uint8)
blue = (255, 0, 0)
red = (0, 0, 255)
green = (0, 255, 0)
cv2.rectangle(canvas, (0,0), (100,100), blue)
cv2.rectangle(canvas, (100,100), (200,200), red, 3)
cv2.rectangle(canvas, (200,200), (300,300), green, -1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
这里我们一个画了三个矩形:
第1个矩形起点为(0,0)
,终点为(100,100)
,颜色为蓝色,线条宽度为默认。
第2个矩形起点为(100,100)
,终点为(200,200)
,颜色为红色,宽度为3。
第3个矩形起点为(200,200)
,终点为(300,300)
,颜色为绿色,并且填充整个矩形。
代码执行结果如下
接下来让我们一起来画一个圆吧。
这里我们需要调用cv2.circle
方法:
cv2.circle(image,center,radius, color,thickness)
image
:这个圆画在的那幅图像
center
:一个坐标元组,表示圆的圆心
radius
:整数,表示圆的半径大小
color
:一个色彩元组,表示圆的颜色【要注意openCV表示颜色的方式(b,g,r)】
thickness
:整数,表示圆直线的宽度,可以不填;为负数时表示填充整个矩形。
import cv2
import numpy as np
canvas = np.zeros((300, 300, 3), np.uint8)
blue = (255, 0, 0)
red = (0, 0, 255)
green = (0, 255, 0)
center = (canvas.shape[1] // 2, canvas.shape[0] // 2)
cv2.circle(canvas, center, 150, blue)
cv2.circle(canvas, center, 100, red, 3)
cv2.circle(canvas, center, 50, green, -1)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)
在上上面的代码中,我们一共画了三个圆,圆心均位于(height//2,width//2)
处:
第1个圆颜色为蓝色,半径为150
,线条宽度为默认。
第2个圆颜色为红色,半径为100
,宽度为3。
第3个圆颜色为绿色,半径为50
,并且填充整个圆。
程序执行结果如下:
最后让我们做一件有趣的事情:在随机位置生成随机大小随机颜色的圆。
import cv2
import numpy as np
canvas = np.zeros((300, 300, 3), np.uint8)
for i in range(0, 25):
radius = np.random.randint(5, high=200)
color = np.random.randint(0, high=256, size=(3,)).tolist()
pt = np.random.randint(0, high=300, size=(2,))
cv2.circle(canvas, tuple(pt), radius, color, -1)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)
上面的代码利用NumPy随机数生成了25
个随机的圆。
我们需要随机生成三个值:半径、圆心和颜色。
我们通过指定[5, hight=200]
来控制我们圆的大小
而在随机颜色值的时候,我们为了得到三个随机数,我们向方法传入了一个关键的参数(3,),说明Numpy需要返回一个包含三个数的列表。
同样的,我们在生成圆心的时候指定了大小[0,hight=300]
,返回一个包含2个随机数的列表
执行程序,结果如下: