PythonOpenCV-图形用户界面-绘图
1. 绘制直线
函数原型
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
参数说明
img:绘制图像的图像
pt1:线段的起点坐标
pt2:线段的终点坐标
color:线段的颜色,采用BGR模型表示,如(255,0,0)
thickness:线条粗细。默认为1,设置为负数(-1)时表示绘制填充图形
lineType:线条类型,默认值为cv2.Line_8
cv2.FILLED:填充
cv2.LINE_4:4条连接线
cv2.LINE_8:8条连接线
cv2.LINE_AA:抗锯齿线,线条更加平滑
shift:表示坐标的数值精度,一般情况下不需要设置
代码示例
import cv2 as cv import numpy as np img = np.zeros((200, 300, 3), np.uint8) # 创建黑色背景图 cv.line(img, (0, 0), (300, 200), (255, 0, 0), 5) # 蓝色线 cv.line(img, (300, 0), (0, 200), (0, 255, 0), 5) # 绿色线 cv.line(img, (250, 0), (0, 150), (0, 0, 255), 5) # 绿色线 cv.imshow("draw", img) cv.waitKey(0)
运行结果
2. 绘制矩形
函数原型
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
参数说明
img:绘制图像的图像
pt1:矩形的第一个顶点
pt2:矩形中与pt1相对的另一个顶点
color:线段的颜色,采用BGR模型表示,如(255,0,0)
thickness:线条粗细。默认为1,设置为负数(-1)时表示绘制填充图形
lineType:线条类型,默认值为cv2.Line_8
cv2.FILLED:填充
cv2.LINE_4:4条连接线
cv2.LINE_8:8条连接线
cv2.LINE_AA:抗锯齿线,线条更加平滑
shift:表示坐标的数值精度,一般情况下不需要设置
代码示例
import cv2 as cv import numpy as np img = np.zeros((200, 300, 3), np.uint8) # 创建黑色背景图 cv.rectangle(img, (20, 20), (100, 100), (255, 0, 0), -1) # 蓝色填充 cv.rectangle(img, (300, 0), (0, 200), (0, 255, 0), 5) # 绿色边框 cv.imshow("draw", img) cv.waitKey(0)
运行结果
3. 绘制圆
函数原型
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
参数说明
img:绘制图像的图像
center:圆心坐标
radius:半径
color:线段的颜色,采用BGR模型表示,如(255,0,0)
thickness:线条粗细。默认为1,设置为负数(-1)时表示绘制填充图形
lineType:线条类型,默认值为cv2.Line_8
cv2.FILLED:填充
cv2.LINE_4:4条连接线
cv2.LINE_8:8条连接线
cv2.LINE_AA:抗锯齿线,线条更加平滑
shift:表示坐标的数值精度,一般情况下不需要设置
代码示例
import cv2 as cv import numpy as np img = np.zeros((200, 300, 3), np.uint8) # 创建黑色背景图 cv.circle(img, (160, 100), 50, (255, 0, 0), 4) # 蓝色边框 cv.circle(img, (160, 100), 23, (0, 255, 0), -1) # 绿色填充 cv.imshow("draw", img) cv.waitKey(0)
运行结果
4. 绘制椭圆
函数原型
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
参数说明
img:绘制图像的图像
center:椭圆圆心坐标
axes:椭圆轴,如(100, 50)表示长轴的一半为100,短轴的一半为50
angle:椭圆长轴的旋转角度,即长轴与x轴的夹角
startAngle:圆弧的开始角度
endAngle:圆弧的结束角度
注意:当开始角度为0°,结束角度为360°时,可以绘制完整的椭圆,否则绘制的是椭圆弧
color:线段的颜色,采用BGR模型表示,如(255,0,0)
thickness:线条粗细。默认为1,设置为负数(-1)时表示绘制填充图形
lineType:线条类型,默认值为cv2.Line_8
cv2.FILLED:填充
cv2.LINE_4:4条连接线
cv2.LINE_8:8条连接线
cv2.LINE_AA:抗锯齿线,线条更加平滑
shift:表示坐标的数值精度,一般情况下不需要设置
代码示例
import cv2 as cv import numpy as np img = np.zeros((200, 300, 3), np.uint8) # 创建黑色背景图 cv.ellipse(img, (160, 100), (120, 50), 0, 0, 360, (255, 0, 0), 4) # 蓝色边框 cv.ellipse(img, (160, 100), (60, 15), 0, 0, 360, (0, 255, 0), -1) # 绿色填充 cv.imshow("draw", img) cv.waitKey(0)
运行结果
5. 绘制多边形
函数原型
cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
参数说明
img:绘制图像的图像
pts:多边形个顶点坐标
isClosed:是否为封闭式多边形
color:线段的颜色,采用BGR模型表示,如(255,0,0)
thickness:线条粗细。默认为1,设置为负数(-1)时表示绘制填充图形
lineType:线条类型,默认值为cv2.Line_8
cv2.FILLED:填充
cv2.LINE_4:4条连接线
cv2.LINE_8:8条连接线
cv2.LINE_AA:抗锯齿线,线条更加平滑
shift:表示坐标的数值精度,一般情况下不需要设置
代码示例
import cv2 as cv import numpy as np img = np.zeros((200, 300, 3), np.uint8) # 创建黑色背景图 pts1 = np.array([[160, 20], [20, 100], [160, 180], [300, 100]], np.int32) # 创建顶点 pts2 = np.array([[160, 60], [60, 100], [160, 140], [260, 100]], np.int32) # 创建顶点 cv.polylines(img, [pts1], True, (255, 0, 0), 4) # 蓝色封闭 cv.polylines(img, [pts2], False, (0, 255, 0), 4) # 绿色不封闭曲线 cv.imshow("draw", img) cv.waitKey(0)
运行结果
6. 绘制文本
函数原型
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
参数说明
img:绘制图像的图像
text:要绘制的文本
org:文本左下角位置
fontFace:字体类型
cv2.FONT_HERSHEY_SIMPLEX:正常大小的sans-serif字体
cv2.FONT_HERSHEY_PLAIN:小号的sans-serif字体
cv2.FONT_HERSHEY_DUPLEX:较复杂的正常大小的sans-serif字体
cv2.FONT_HERSHEY_COMPLEX:正常大小的serif字体
cv2.FONT_HERSHEY_TRIPLEX:较复杂的正常大小的serif字体
cv2.FONT_HERSHEY_COMPLEX_SMALL:简化版正常大小的serif字体
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX:手写风格字体
cv2.FONT_HERSHEY_SCRIPT_COMPLEX:较复杂的手写风格字体
cv2.FONT_ITALIC:斜体
fontScale:字体大小
bottomLeftOrigin:文本方向,默认为False,设置为True时,文本为垂直镜像效果
color:线段的颜色,采用BGR模型表示,如(255,0,0)
thickness:线条粗细。默认为1,设置为负数(-1)时表示绘制填充图形
lineType:线条类型,默认值为cv2.Line_8
cv2.FILLED:填充
cv2.LINE_4:4条连接线
cv2.LINE_8:8条连接线
cv2.LINE_AA:抗锯齿线,线条更加平滑
代码示例
import cv2 as cv import numpy as np img = np.zeros((200, 320, 3), np.uint8)+255 # 创建白色背景图 font = cv.FONT_HERSHEY_SCRIPT_SIMPLEX cv.putText(img, 'OpenCv', (50, 100), font, 2, (255, 0, 0), 2, cv.LINE_AA) # 绘制文本 cv.putText(img, 'OpenCv', (50, 100), font, 2, (255, 0, 0), 2, cv.LINE_AA, True) # 绘制垂直镜像文本 cv.imshow("draw", img) cv.waitKey(0)
运行结果
7. 绘制汉字
由于OpenCV中的cv2.putText()函数不能绘制汉字,可以借助PIL模块进行绘制
代码示例
import cv2 as cv import numpy as np from PIL import ImageFont, ImageDraw, Image img = np.zeros((200, 320, 3), np.uint8)+255 # 创建白色背景图 fontpath = "STSONG.TTF" # 指定字体文件名 font1 = ImageFont.truetype(fontpath, 36) # 载入字体,设置字号 img_pil = Image.Fromarray(img) # 转成PIL对象 draw = ImageDraw(img_pil) # 创建Draw对象 draw.text((50, 60), '计算机视觉', font=font1, fill=(0, 0, 0)) # 绘制文本 img = np.array(img_pil) # 转成图像数组 cv.imshow("draw", img) cv.waitKey(0)
8. 绘制箭头
函数原型
cv2.arrowedLine(img, pt1, pt2, color[, thickness[, lineType[, shitf[, tipLength]]])
参数说明
img:绘制图像的图像
pt1:线段的起点坐标
pt2:线段的终点坐标
color:线段的颜色,采用BGR模型表示,如(255,0,0)
thickness:线条粗细。默认为1,设置为负数(-1)时表示绘制填充图形
lineType:线条类型,默认值为cv2.Line_8
cv2.FILLED:填充
cv2.LINE_4:4条连接线
cv2.LINE_8:8条连接线
cv2.LINE_AA:抗锯齿线,线条更加平滑
shift:表示坐标的数值精度,一般情况下不需要设置
tipLength:箭尖相对于箭头长度的比例,默认为0.1
代码示例
import cv2 as cv import numpy as np img = np.zeros((200, 320, 3), np.uint8)+255 # 创建白色背景图 cv.arrowedLine(img, (50, 50), (50, 150), (0, 0, 255), 2) # 红色垂直箭头 cv.arrowedLine(img, (50, 50), (300, 50), (255, 0, 0), 2) # 蓝色水平箭头 cv.imshow('Draw', img) cv.waitKey(0)
运行结果
/*-------------------------------------------------------------------------------------------------------
笔者说明:
该笔记来源于本人学习Python + OpenCv时的资料,
分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。
时间:2023年4月15日
------------------------------------------------------------------------------------------------------------*/