要使用OpenCV绘制图形,除了cv2库之外,我们还需要便于进行矩阵操作的numpy库:
import cv2 as cv
import numpy as np
先展示代码:
blank = np.zeros((300,500,3), dtype='unit8')
cv.imshow('Blank', blank)
代码解释:首先用numpy生成一个元素的值全为零的多维数组,dtype
表示数组里的元素的类型,这是RGB图片所使用的类型(具体是什么含义这里不详细说明);(300,500,3)
中的前两个表示这是一个高为300、宽为500的图片,最后的3表示这是一个三通道(channel)的图片(即r,g,b三个通道)。
当我们用cv.imshow()
将这个图片展示出来,就会得到一个黑的图片,什么也没有(因为数组元素全为零)。
我们可以给一个图片的子区域(subarea)上色(当然这工艺很粗糙)。我们以上述的空白图片为例:
blank[150:200, 300:400] = 0,0,255
cv.imshow('Red',blank)
代码解释:这其实就是numpy中的数组/矩阵的赋值,把blank
的某一部分区域,即高从150到200、宽从300到400的区域,赋相应的值,即0(blue channel),0(green channel),255(red channel),结果就是红色。注意OpenCV比较“奇怪”,颜色通道的顺序不是RGB而是BGR。
cv.rectangle(blank, (0, 0), (blank.shape[1] // 2, blank.shape[0] // 2),
(0, 255, 0), thickness=-1)
cv.imshow('Rectangle', blank)
代码解释:我们直接利用OpenCV中的函数rectangle
即可。函数的参数很多,大家在写代码时IDE弹出的自动补全应该也能看到:
大家可能比较困惑的是为什么第三个参数中先是blank.shape[1] // 2
,后是blank.shape[0] // 2
。这是因为OpenCV中,坐标系中的x轴是水平的,y轴是垂直的,并且图片的shape是“先高后宽”。
cv.circle(blank, (blank.shape[1] // 2, blank.shape[0] // 2),
40, (0, 0, 255), thickness=-3)
cv.imshow('Circle', blank)
代码解释:与绘制矩形类似,我们直接用OpenCV中的函数circle
,各参数分别为:
cv.line(blank, (100, 250), (300, 200), (255, 255, 255), thickness=3)
cv.imshow('Line', blank)
代码解释:类似的,这里使用line
函数,参数分别为:
注意:在上述代码之后最好加上cv.waitKey(0)
,防止图片一闪而过。