一、绘制简单的几何形状和添加文本
opencv中绘制图形很简单,我们只需要使用下面这些常用函数即可。
#画线 cv2.line() #画圆 cv2.circle() #画矩形 cv. rectangle() #画椭圆 cv.ellipse() #向图像添加文本 cv.putText()
在上述所有功能中,我们可以看到一些常见的参数,如下所示:
- img:我们要绘制形状的图像
- color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)就是蓝色。灰度图的话,我们只需要传递标量值即可。
- 厚度:线或圆等的粗细。如果对闭合图形(如圆)传递-1,它就会填充整个形状。默认厚度=1
- line Type:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。(我们曲线的话可以选择*CV. LINE AA*,这是一种抗锯齿的线条)
下面我们具体来看看各个函数的具体应用:
画线:
要绘制一条线,我们需要传递线的开始和结束坐标。下面我们将创建一个黑色图像,并从左上角到右下角在其上绘制一条蓝线。
import numpy as np import cv2 as cv # 创建黑色的图像 img = np.zeros((512,512,3), np.uint8) # 绘制一条厚度为5的蓝色对角线 cv.line(img,(0,0),(511,511),(255,0,0),5)
画矩形:
要绘制矩形,我们需要矩形的左上角和右下角的坐标。这次,我们将在图像的右上角绘制一个绿色矩形。
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
画圆圈:
要绘制一个圆,我们需要其中心坐标和半径。下面我们将在上面绘制的矩形内绘制一个圆。
cv.circle(img,(447,63), 63, (0,0,255), -1)
画椭圆:
要绘制椭圆,我们需要传递几个参数。一个参数是中心位置(x,y)。下一个参数是轴长度(长轴长度,短轴长度)。angle是椭圆沿逆时针方向旋转的角度。startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。如果我们传递0和360的话,就可以得到一个完整的椭圆。下面我们在图像的中心绘制一个椭圆形。
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
如果我们想要画不规则的多边形该怎么做呢?
画多边形:
要绘制多边形,我们首先需要顶点的坐标。将这些点组成形状为 ROWSx1x2 的数组,其中ROWS 是顶点数,并且其类型应为int32。下面我们绘制一个带有四个顶点的黄色小多边形。
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32) pts = pts.reshape((-1,1,2)) cv.polylines(img,[pts],True,(0,255,255))
注意:cv.polylines()可用于绘制多条线。只需创建要绘制的所有线条的列表,然后将其传递给函数即可。如果第三个参数为False,将获得一条连接所有点的折线,而不是闭合形状。
向图像添加文本:
要将文本放入图像中,我们需要传递以下参数:
- 要写入的文字数据。
- 要放置它的位置坐标(即文字开始的左下角)。
- 字体类型(我们可以检查**cv.putText**文档以获取受支持的字体)。
- 字体比例(我们可以指定字体大小)。
- 常规的内容,例如颜色,厚度,线条类型等。为了获得更好的外观,我们可以使用lineType = cv.LINE_AA。
下面我们在图像上写上‘opencv’这六个字母:
font = cv.FONT_HERSHEY_SIMPLEX cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
我们来看一下最终的图像:
# 创建黑色的图像 img = np.zeros((512, 512, 3), np.uint8) # 绘制一条厚度为5的蓝色对角线 cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5) cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3) cv.circle(img, (447, 63), 63, (0, 0, 255), -1) cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1) pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32) pts = pts.reshape((-1, 1, 2)) cv.polylines(img, [pts], True, (0, 255, 255)) font = cv.FONT_HERSHEY_SIMPLEX cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA) cv.imshow('image', img) cv.waitKey(0) cv.destroyAllWindows()
最终实现的效果: