1. 学习目标
- 学会使用 cv.line 绘制一条线;
- 学会使用 cv.circle 绘制圆;
- 学会使用 cv.rectangle 绘矩形;
- 学会使用 cv.ellipse 绘椭圆。
2. 图像公共参数说明
2.1 参数说明
参数 |
说明 |
img |
表示输入图像,允许单通道灰度图像或多通道彩色图像。 |
color |
表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。 |
thickness |
表示绘制直线的粗细,默认值 1px,-1 表示内部填充。 |
lineType |
表示绘制直线的线性,默认为 LINE_8。 |
shift |
表示点坐标的小数位数,默认为 0。 |
2.2 lineType 值说明
值 |
描述 |
cv.FILLED |
表示内部填充(实心图形)。 |
cv.LINE_4 |
表示 4 邻接线型。 |
cv.LINE_8 |
表示 8 邻接线型。 |
cv.LINE_AA |
表示抗锯齿线型,图像更平滑。 |
3. 绘制直线 cv.line 函数说明
3.1 cv.line() 函数使用
cv.line(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
3.2 参数说明
参数 |
说明 |
img |
表示输入图像,允许单通道灰度图像或多通道彩色图像。 |
pt1 |
表示线段第一个点的坐标,(x1, y1)。 |
pt2 |
表示线段第二个点的坐标,(x2, y2)。 |
color |
表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。 |
thickness |
表示绘制直线的粗细,默认值 1px,-1 表示内部填充。 |
lineType |
表示绘制直线的线性,默认为 LINE_8。 |
shift |
表示点坐标的小数位数,默认为 0。 |
3.3 注意
- 绘图操作会直接对传入的图像 img 进行修改,是否接受函数返回值都可以。
- 在绘制直线时不能选择填充线型 cv.FILLED ,否则会报错。
- 图像尺寸较小时,LINE_4 线型存在明显的锯齿,LINE_AA 线型更加平滑。
- 图像尺寸较大时,则线型的影响并不大,推荐采用默认值 LINE_8。
- 如果设置了 thickness,关键词 lineType 可以省略;如果没有设置 thickness,则关键词 lineType 不能省略,否则输入的线型参数会被错误地解释为线宽。
4. 绘制圆形 cv.circle 函数说明
4.1 cv.circle() 函数使用
cv.circle(img, center, radius, color[, thickness=1, lineType=LINE_8, shift=0]) → img
4.2 参数说明
参数 |
说明 |
img |
表示输入图像,允许单通道灰度图像或多通道彩色图像。 |
center |
表示圆心点的坐标,(x, y) 格式的元组。 |
radius |
表示圆的半径,整数。 |
color |
表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。 |
thickness |
表示绘制直线的粗细,默认值 1px,-1 表示内部填充。 |
lineType |
表示绘制直线的线性,默认为 LINE_8。 |
shift |
表示点坐标的小数位数,默认为 0。 |
4.3 注意
- 在单通道的灰度图像上只能绘制灰度线条,不能绘制彩色线条 。但是,线条颜色 color 可以是标量 b,也可以是元组 (b,g,r),都会被解释为灰度值 b。元组中的后两个通道的参数是无效的。
5. 绘制矩形 cv.rectangle 函数说明
5.1 cv.rectangle() 函数使用
cv.rectangle(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
5.2 参数说明
参数 |
说明 |
img |
表示输入图像,允许单通道灰度图像或多通道彩色图像。 |
pt1 |
表示矩阵第一个点的坐标,(x1, y1) 格式的元组。 |
pt2 |
表示与 pt1 成对角的矩阵第二个点的坐标,(x2, y2) 格式的元组。 |
color |
表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。 |
thickness |
表示绘制直线的粗细,默认值 1px,-1 表示内部填充。 |
lineType |
表示绘制直线的线性,默认为 LINE_8。 |
shift |
表示点坐标的小数位数,默认为 0。 |
5.3 注意
- 使用rec参数绘制矩形,r.tl() 和 r.br() 是矩形的对角点。
6. 绘制椭圆 cv.ellipse 函数说明
6.1 cv.ellipse() 函数使用
cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness=1, lineType=LINE_8, shift=0]) → img
6.2 参数说明
参数 |
说明 |
img |
表示输入图像,允许单通道灰度图像或多通道彩色图像。 |
center |
表示椭圆的圆心点的坐标,(x, y) 格式的元组。 |
axes |
表示椭圆的轴长,格式为 (长轴长度的一半, 短轴长度的一半) 格式的元组。 |
angle |
表示椭圆沿水平方向逆时针旋转的角度。 |
startAngle |
表示沿长轴顺时针方向开始显示的角度。 |
endAngle |
表示沿长轴顺时针结束显示的角度。 |
color |
表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。 |
thickness |
表示绘制直线的粗细,默认值 1px,-1 表示内部填充。 |
lineType |
表示绘制直线的线性,默认为 LINE_8。 |
shift |
表示点坐标的小数位数,默认为 0。 |
7. 直线绘制实例
7.1 实例代码
import cv2 as cv
def draw_line():
img = cv.imread("./images/messi5.jpg")
h,w,c = img.shape
img = cv.line(img,(0,0),(w*2,h*2),(255,0,0),10)
img = cv.line(img,(10,int(h/2)),(w - 10,int(h / 2)),(0,255,0),5)
cv.imshow('line', img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
draw_line()
7.2 绘制结果
8. 圆形绘制实例
8.1 实例代码
import cv2 as cv
import numpy as np
def draw_circle():
img = np.zeros((100,500,3),np.uint8)
img[:] = 255
# 绘制默认1px边框的圆
cv.circle(img,(50,50),25,(255,0,0))
# 绘制填充圆 thickness
cv.circle(img,(150,50),25,(255,0,0),-1)
# 绘制填充圆 lineType
cv.circle(img,(250,50),25,(0,255,0),lineType=cv.FILLED)
# 绘制边框10px的圆
cv.circle(img,(350,50),25,(255,0,0),10)
# 绘制平滑边框10px的圆
cv.circle(img,(450,50),25,(255,0,0),10,cv.LINE_AA)
cv.imshow('circle', img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
draw_circle()
8.2 绘制结果
8.3 注意
- 在绘制圆形时不能选择填充线型 cv.FILLED,无效。
9. 绘制矩形实例
9.1 实例代码
import cv2 as cv
import numpy as np
def draw_rectangle():
img = np.zeros((200,500,3),np.uint8)
img[:] = 255
# 绘制默认1px边框的矩形
cv.rectangle(img,(10,10),(50,60),(0,0,255))
# 绘制10px边框的矩形
cv.rectangle(img,(110,10),(150,60),(0,0,255),10)
# 绘制填充矩形 thickness
cv.rectangle(img,(210,10),(250,60),(0,0,255),-1)
# 绘制平滑边框10px的矩形
cv.rectangle(img,(310,10),(350,60),(0,0,255),10,cv.LINE_AA)
cv.imshow('rectangle', img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
draw_rectangle()
9.2 绘制结果
10. 绘制椭圆实例
10.1 实例代码
import cv2 as cv
import numpy as np
def draw_ellipse():
img = np.zeros((200,500,3),np.uint8)
img[:] = 255
# 绘制默认1px边框的椭圆
cv.ellipse(img,(50,50),(50,30),0,0,360,(255,0,0))
# 绘制填充椭圆 thickness
cv.ellipse(img,(150,50),(50,30),0,0,360,(255,0,0),-1)
# 绘制10px边框的椭圆
cv.ellipse(img,(260,50),(50,30),0,0,360,(255,0,0),10)
# 绘制平滑边框10px的矩形
cv.ellipse(img,(380,50),(50,30),0,0,360,(255,0,0),10,cv.LINE_AA)
# 椭圆旋转30度
cv.ellipse(img,(380,150),(50,30),30,0,360,(255,0,0),10,cv.LINE_AA)
# 半椭圆绘制
cv.ellipse(img,(260,150),(50,30),0,0,180,(255,0,0),10)
# 绘制一个圆
cv.ellipse(img,(150,150),(30,30),0,0,360,(255,0,0),10)
# 绘制半圆
cv.ellipse(img,(50,150),(30,30),0,180,360,(255,0,0),10)
cv.imshow('ellipse', img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
draw_ellipse()
10.2 绘制结果
11. 总结
- 绘制弧形使用椭圆绘制函数;
- 填充图形使用 thickness 的值为 -1;
- 绘制图形不能超出图像,超出部分直接按照图像边缘截取;
- 图像尺寸较小时,LINE_4 线型存在明显的锯齿,LINE_AA 线型更加平滑;
- 图像尺寸较大时,则线型的影响并不大,推荐采用默认值 LINE_8。