学习画线、圆和矩形等多种几何形状,给图片添加文字。
绘制各种几何形状、添加文字
OpenCV函数:cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()
绘制形状的函数有一些共同的参数,
img:要绘制形状的图片
color:绘制的颜色,绘制彩色就传入BGR的一组值,如(255,0,0);灰度图,传入一个灰度值就行
thickness:线宽,默认为1;对于矩形/圆之类的封闭形状而言,传入-1表示填充形状
画线
line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
画矩形
rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
画圆
circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
画椭圆
ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
# 参数2:椭圆中心(x, y)
# 参数3:x / y轴的长度
# 参数4:angle–椭圆的旋转角度(顺时针)
# 参数5:startAngle–椭圆的起始角度(顺时针)
# 参数6:endAngle–椭圆的结束角度(顺时针)
画多边形
画多边形需要指定一系列多边形的顶点坐标,相当于从第一个点到第二个点画直线,再从第二个点到第三个点画直线….
# 定义四个顶点坐标
pts = np.array([[10, 5], [50, 10], [70, 20], [20, 30]], np.int32)
# 顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1, 1, 2))
polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
绘制多条直线
使用cv2.polylines()要比cv2.line()高效很多
polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
cv2.polylines(img, [line1, line2, line3], True, (0, 255, 255))
添加文字
使用cv2.putText()添加文字,它的参数也比较多,
putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
参数2:要添加的文本
参数3:文字的起始坐标(左下角为起点)
参数4:字体
参数5:文字大小(缩放比例)
参数6:LineTypes
http://ex2tron.wang/opencv-python-drawing-function/
填充填充多边形
fillPoly(img, pts, color, lineType=None, shift=None, offset=None)
# pts多边形的点位置
# -*-encoding:utf-8-*- import pytesseract from PIL import Image from PIL import ImageFilter from PIL import ImageFont from PIL import ImageDraw import numpy as np from PIL import Image import cv2 def main(): # =================================画线 # 创建一副黑色的图片 img = np.zeros((512, 512, 3), np.uint8) # 画一条线宽为5的蓝色直线,参数2:起点,参数3:终点 cv2.line(img, (0, 0), (512, 512), (255, 0, 0), 5) # =================================画矩形 # 画一个绿色边框的矩形,参数2:左上角坐标,参数3:右下角坐标 cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3) # =================================画圆 # 画一个填充红色的圆,参数2:圆心坐标,参数3:半径 # cv2.circle(img, (447, 63), 63, (0, 0, 255), -1) cv2.circle(img, (447, 63), 63, (0, 0, 255), 1) # =================================画椭圆 # 在图中心画一个填充的半圆 cv2.ellipse(img, (256, 256), (100, 50), 45, 0, 180, (255, 0, 0), 1) # 参数2:椭圆中心(x, y) # 参数3:x / y轴的长度 # 参数4:angle–椭圆的旋转角度(顺时针) # 参数5:startAngle–椭圆的起始角度(顺时针) # 参数6:endAngle–椭圆的结束角度(顺时针) # =================================画多边形 # 定义四个顶点坐标 pts = np.array([[10, 5], [50, 10], [70, 20], [20, 30]], np.int32) print("pts = ", pts) # 顶点个数:4,矩阵变成4*1*2维 pts = pts.reshape((-1, 1, 2)) print("pts2 = ", pts) print("[pts] = ", [pts]) cv2.polylines(img, [pts], True, (0, 255, 255)) # polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None) # =================================绘制多条直线 # 使用cv2.polylines()画多条直线 line1 = np.array([[100, 20], [300, 20]], np.int32).reshape((-1, 1, 2)) line2 = np.array([[100, 60], [300, 60]], np.int32).reshape((-1, 1, 2)) line3 = np.array([[100, 100], [300, 100]], np.int32).reshape((-1, 1, 2)) cv2.polylines(img, [line1, line2, line3], True, (0, 255, 255)) # =================================添加文字 # 添加文字 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, 'ex2tron', (10, 500), font, 2, (255, 255, 255), 2, lineType=cv2.LINE_AA) # putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None) # =================================填充填充多边形 # 多边形的点位置 tri1 = np.array([[0, 0], [25, 10], [10, 20]], np.int32) cv2.fillPoly(img, [tri1], (255, 255, 255)) cv2.imshow('line', img) cv2.waitKey(0) if __name__ == '__main__': main()