如何使用OpenCV绘制简单的几何图形?

要使用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),防止图片一闪而过。

你可能感兴趣的:(opencv,计算机视觉,python)