前言
- 本文是个人快速入门OpenCV-Python的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。
- 更多精彩内容,可点击进入
OpenCV-Python快速入门专栏或我的个人主页查看
前提条件
- 熟悉Python
实验环境
- Python 3.x (面向对象的高级语言)
- OpenCV 4.0(python第三方库)
pip3 install opencv-python
绘图基础
- OpenCV 提供了绘制直线的函数 cv2.line()、绘制矩形的函数cv2.rectangle()、绘制圆的函数cv2.circle()、绘制椭圆的函数cv2.ellipse()、绘制多边形的函数 cv2.polylines()、在图像内添加文字的函数 cv2.putText()等多种绘图函数。
绘制直线
import cv2
import numpy as np
'''
img = cv2.line( img, pt1, pt2, color[, thickness[, lineType ]])
参数说明:
img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
pt1 表示线段的第 1 个点(起点)。
pt2 表示线段的第 2 个点(终点)。
color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
需要注意,颜色通道的顺序是 BGR,而不是 RGB。
thickness:线条的粗细。
默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3), np.uint8)
img = cv2.line(img,(0,0),(400,200),(255,0,0),3)
img = cv2.line(img,(0,200),(400,200),(0,255,0),1)
img = cv2.line(img,(100,0),(200,400),(0,0,255),6)
cv2.namedWindow('cv2.line')
cv2.imshow('cv2.line', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制矩形
import cv2
import numpy as np
'''
img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType]] )
参数说明:
img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
pt1 为矩形顶点。
pt2 为矩形中与 pt1 对角的顶点。
color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
需要注意,颜色通道的顺序是 BGR,而不是 RGB。
thickness:线条的粗细。
默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3), np.uint8)
img = cv2.rectangle(img,(100,100),(300,300),(0,0,255),-1)
cv2.namedWindow('cv2.rectangle')
cv2.imshow('cv2.rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制圆形
import cv2
import numpy as np
'''
img = cv2.circle( img, center, radius, color[, thickness[, lineType]] )
参数说明:
img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
center 为圆心。
radius 为半径。
color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
需要注意,颜色通道的顺序是 BGR,而不是 RGB。
thickness:线条的粗细。
默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3),dtype="uint8")
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
# 将图像的中心作为圆心,实际值为 400/2
for r in range(5,round(400/2),12):
cv2.circle(img,(centerX,centerY),r,(255,255,255),3)
# circle(载体图像,圆心,半径,颜色)
cv2.imshow("cv2.circle",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制椭圆
import cv2
import numpy as np
'''
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle,
color[,thickness[, lineType]])
参数说明:
img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
center 为椭圆的圆心坐标。
axes 为轴的长度。
angle 为偏转的角度。
startAngle 为圆弧起始角的角度。
endAngle 为圆弧终结角的角度。
color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
需要注意,颜色通道的顺序是 BGR,而不是 RGB。
thickness:线条的粗细。
默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3),dtype="uint8")
center=(round(400/2),round(400/2))
size=(100,200)
# 轴的长度
for i in range(0,5):
# 偏移角度
angle = np.random.randint(0,361)
# 生成随机颜色,3 个[0,256)的随机数
color = np.random.randint(0,high = 256,size = (3,)).tolist()
# 随机粗细
thickness = np.random.randint(1,9)
cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("cv2.ellipse",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制多边形
import cv2
import numpy as np
'''
img = cv2.polylines( img, pts, isClosed, color[, thickness[, lineType[, shift]]])
参数说明:
img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
pts 为多边形的各个顶点。
isClosed 为闭合标记,用来指示多边形是否是封闭的。
若该值为 True,则将最后一个点与第一个点连接,让多边形闭合;
否则,仅仅将各个点依次连接起来,构成一条曲线。
color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
需要注意,颜色通道的顺序是 BGR,而不是 RGB。
thickness:线条的粗细。
默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
lineType:线条的类型,默认是 8 连接类型。
注:需要给出每个顶点的坐标。这些点的坐标构建了
一个大小等于“顶点个数*1*2”的数组,
这个数组的数据类型必须为 numpy.int32。
'''
img = np.zeros((400,400,3),dtype="uint8")
# 生成各个顶点,注意数据类型为 int32
pts=np.array([[200,50],[300,200],[200,350],[100,200]], np.int32)
# 第 1 个参数为-1, 表明它未设置具体值,它所表示的维度值是通过其他参数值计算得到的
pts=pts.reshape((-1,1,2))
# # 调用函数 cv2.polylines()完成多边形绘图。注意,第 3 个参数控制多边形是否封闭
cv2.polylines(img,[pts],True,(255,255,255),8)
cv2.imshow("cv2.polylines",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制文字
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
'''
img=cv2.putText(img, text, org, fontFace, fontScale,
color[, thickness[,lineType[, bottomLeftOrigin]]])
参数说明:
img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
text 为要绘制的字体。
org 为绘制字体的位置,以文字的左下角为起点。
fontFace 表示字体类型,其参数类型及含义。
fontScale 表示字体大小。
color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
需要注意,颜色通道的顺序是 BGR,而不是 RGB。
thickness:线条的粗细。
默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
lineType:线条的类型,默认是 8 连接类型。
bottomLeftOrigin 用于控制文字的方向。
默认值为 False,当设置为 True 时,文字是垂直镜像的效果。
'''
img = np.zeros((400,400,3),dtype="uint8")
cv2.putText(img,'OpenCV',(20,150), cv2.FONT_HERSHEY_SIMPLEX, 3,(0,255,0),15)
cv2.putText(img,'OpenCV',(20,150), cv2.FONT_HERSHEY_SIMPLEX, 3,(0,0,255),5)
# 绘制中文
# 创建一个可以在给定图像上绘图的对象
img_np= Image.fromarray(img)
draw = ImageDraw.Draw(img_np)
# 字体的格式
fontStyle = ImageFont.truetype("simsun.ttc", size=64 ,encoding="utf-8")
# 绘制文本
draw.text((10, 250),"数字图像处理",(0, 255, 0),font=fontStyle)
img = np.array(img_np)
cv2.imshow("cv2.putText",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
参考文献
[1] https://opencv.org/
[2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019
- 更多精彩内容,可点击进入
OpenCV-Python快速入门专栏或我的个人主页查看