目录
第 2 篇基础篇
本篇介绍绘制图形和文字、图像的几何变换、图像的阈值处理和图像的运算。学习完这一部分内容后,读者不仅能够直观地看到运用 OpenCV 处理图像后的效果,还能够了解 OpenCV 程序的编码步骤和注意事项。
绘制图形和文字
OpenCV 提供了许多绘制图形的方法,包括绘制线段的 line()方法、绘制矩形的 rectangle()方法、绘制圆形的 circle()方法、绘制多边形的 polylines()方法和绘制文字的 putText()方法。本章将依次对上述各个方法进行讲解,并使用上述方法绘制相应的图形。
线段的绘制
img = cv2.line(img, pt1, pt2, color, thickness)
注意
线条颜色是 RGB 格式的,例如红色的 RGB 值是(255, 0, 0)。但是在 OpenCV 中,RGB 图像的通道顺序被转换成 B→G→R,因此(0, 0, 255)代表的是红色。
绘制线段并拼成一个「王」字。
import numpy as np # 导入 Python 中的 numpy 模块
import cv2
# np.zeros():创建了一个画布
# (300, 300, 3):一个 300 x 300,具有 3 个颜色空间(即 Red、Green 和 Blue)的画布
# np.uint8:OpenCV 中的灰度图像和 RGB 图像都是以 uint8 存储的,因此这里的类型也是 uint8
canvas = np.zeros((300, 300, 3), np.uint8)
# 在画布上,绘制一条起点坐标为(50, 50)、终点坐标为(250, 50)、蓝色的、线条宽度为 5 的线段
canvas = cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 5)
# 在画布上,绘制一条起点坐标为(50, 150)、终点坐标为(250, 150)、绿色的、线条宽度为 10 的线段
canvas = cv2.line(canvas, (50, 150), (250, 150), (0, 255, 0), 10)
# 在画布上,绘制一条起点坐标为(50, 250)、终点坐标为(250, 250)、红色的、线条宽度为 15 的线段
canvas = cv2.line(canvas, (50, 250), (250, 250), (0, 0, 255), 15)
# 在画布上,绘制一条起点坐标为(150, 50)、终点坐标为(150, 250)、黄色的、线条宽度为 20 的线段
canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 20)
cv2.imshow(「Lines」, canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
矩形的绘制
OpenCV 提供了用于绘制矩形的 rectangle()方法,使用这个方法既可以绘制矩形边框,也可以绘制实心矩形。rectangle()方法的语法格式如下:
img = cv2.rectangle(img, pt1, pt2, color, thickness)
圆形的绘制
OpenCV 提供了用于绘制圆形的 circle()方法,这个方法与 rectangle()方法的功能相同,既可以绘制圆形边框,也可以绘制实心圆形。circle()方法的语法格式如下:
img = cv2.circle(img, center, radius, color, thickness)
多边形的绘制
openCV 提供了绘制多边形的 polylines()方法,使用这个方法绘制的多边形既可以是闭合的,也可以是不闭合的。polylines()方法的语法格式如下:
img = cv2.polylines(img, pts, isClosed, color, thickness)
文字的绘制
OpenCV 提供了用于绘制文字的 putText()方法,使用这个方法不仅能够设置字体的样式、大小和颜色,而且能够使字体呈现斜体的效果,还能够控制文字的方向,进而使文字呈现垂直镜像的效果。putText()方法的语法格式如下:
img = cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineTy
说明
使用 putText()方法时,thickness、lineType 和 bottomLeftOrigin 是可选参数,有无均可。
注意 绘制文本只能写英文不能写中文 不然会乱码
文字的垂直镜像效果
在 putText()方法的语法格式中,有一个控制绘制文字时的方向的参数,即 bottomLeftOrigin,其默认值为 False。当 bottomLeftOrigin 为 True 时,文字将呈现垂直镜像效果。
动态绘制图形
import cv2
import time
import numpy as np
width,height=800,800
r=20
x=r+10
y=r+100
x_offer=y_offer=10
while cv2.waitKey(1)==-1:
if x>width-r or x<r:
x_offer*=-1
if y>height-r or y<r:
y_offer*=-1
x+=x_offer
y+=y_offer
img=np.ones((width,height,3),np.uint8)*255
cv2.circle(img,(x,y),r,(255,0,0),-1)
cv2.imshow('img',img)
time.sleep(1/120)
cv2.destroyAllWindows()
图像的几何变换
几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、映射和透视效果。这些几何变换操作都涉及复杂、精密的计算,OpenCV 将这些计算过程封装成非常灵活的方法,开发者只需修改一些参数,就能实现图像的变换效果。本章将介绍几种常见的几何变换效果及其实现方法。
缩放
dst = cv2.resize(src, dsize, fx, fy, interpolation)
dsize 参数实现缩放
dsize 参数的格式是一个元组,例如(100, 200),表示将图像按照宽 100 像素、高 200 像素的大小进行缩放。如果使用 dsize 参数,就可以不写 fx 和 fy 参数。
fx 和 fy 参数实现缩放
使用 fx 参数和 fy 参数控制缩放时,dsize 参数值必须使用 None,否则 fx 和 fy 失效。
fx 参数和 fy 参数可以使用浮点值,小于 1 的值表示缩小,大于 1 的值表示放大。其计算公式为:
翻转
OpenCV 通过 cv2.flip()方法实现翻转效果,其语法如下
dst = cv2.flip(src, flipCode)