要使用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;
- 紧接着的两个参数是矩形的左上顶点和右下顶点的坐标(因为这两个点就能确定矩形的位置);
- 第四个参数是矩形边框的颜色;
- 第五个参数是矩形的边框的粗细,如果是负数,那么表示将矩形填充,即本例所示。
- 还有其他一些参数,本例没有用到,大家可以去查官方文档。
大家可能比较困惑的是为什么第三个参数中先是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
,各参数分别为:
- 所绘制圆形的对象,即blank
- 圆心的坐标位置,这里选择在整个图片的中心
- 圆的半径大小(圆的圆心和半径就能确定一个圆)
- 圆的轮廓线的颜色,这里是红色
- 圆的轮廓线的粗细,如果是负数,那么表示将圆形填充,即本例所示。
- 其他参数,本例未显示。
绘制直线
cv.line(blank, (100, 250), (300, 200), (255, 255, 255), thickness=3)
cv.imshow('Line', blank)
代码解释:类似的,这里使用line
函数,参数分别为:
- 第一个参数:要绘制直线的图片对象,即blank
- 第二、三个参数:直线的两个端点的坐标(注意OpenCV中图片的x、y轴的方向)
- 第四个参数:直线的颜色,这里是白色
- 第五个参数:直线的粗细
- 其他参数没有使用,是默认值
注意:在上述代码之后最好加上cv.waitKey(0)
,防止图片一闪而过。