原文链接:http://www.juzicode.com/archives/5575
在 OpenCV-Python教程:绘制直线、圆形、方形 一文中介绍了怎么绘制直线、圆形、方形,这里介绍下怎么绘制多边形、输出文字。
1、多边形
cv2.polylines()用来画多边形。
- 第1个参数为图像对象;
- 第2个参数为包含一个三元组元素的列表,包含了多边形的各个顶点;
- 第3个参数为Bool型参数表示是否闭合;
- 第4个参数为颜色;
- 第5个参数为线条宽度,注意不能使用-1表示填充;
方形可以看做是一种特殊的多边形,知道其4个顶点的坐标也可以利用polylines()画出方形。下面这个例子利用polylines()画出一个方形和五角星:
-
import cv2
-
import numpy
as np
-
print(
'VX公众号: 桔子code / juzicode.com')
-
print(
'cv2.__version__:',cv2.__version__)
-
-
img = np.ones((
512,
512,
3))
#白色背景
-
color=(
0,
255,
0)
#绿色
-
#五角星
-
pts = np.
array([[
70,
190],[
222,
190],[
280,
61],[
330,
190],[
467,
190],
-
[
358,
260],[
392,
380],[
280,
308],[
138,
380],[
195,
260]])
-
pts = pts.reshape((
-1,
1,
2))
#reshape为10x1x2的numpy
-
print(pts.shape)
# (10, 1, 2)
-
cv2.polylines(img,[pts],
True,color,
5)
-
#方形
-
pts = np.
array([[
10,
50],[
100,
50],[
100,
100],[
10,
100]])
-
pts = pts.reshape((
-1,
1,
2))
-
cv2.polylines(img,[pts],
True,color,
3)
-
-
cv2.imshow(
'juzicode.com',img)
-
cv2.waitKey()
运行结果:
2、输出文字
cv2.putText()用来输出文字。
- 第1个参数为图像对象;
- 第2个参数为要输出的字符串;
- 第3个参数为起始点位置;
- 第4个参数为字体;
- 第5个参数为字体大小;
- 第6个参数为颜色;
- 第7个参数为线条宽度,默认为1;
- 第8个参数为线型,默认为LINE8;
-
import cv
2
-
import numpy as np
-
print('VX公众号: 桔子code / juzicode.com')
-
print('cv
2.__version__:',cv
2.__version__)
-
-
img = np.ones((
512,
512,
3))
#白色背景
-
-
text = 'VX:juzicode'
-
start = (
10,
200)
-
font = cv
2.FONT_HERSHEY_SIMPLEX
-
fontscale =
2
-
color=(
0,
0,
255)
#红色
-
thick =
2
-
linetype = cv
2.LINE_AA
-
cv2.putText(img,text,start, font, fontscale, color,thick,linetype)
-
-
cv2.imshow('juzicode.com',img)
-
cv2.waitKey()
运行结果:
上面的例子是输出英文,我们试下包含中文的情况,将text内容修改为“VX:桔子code”,输出乱码了:
通过dir()命令可以将所有FONT开头的内容打印出来,OpenCV中并没有包含中文字体:
-
>>> cv2.__version_
_
-
'4.5.2'
-
>>>
-
>>> [i for i in dir(cv2) if i.startswith(
'FONT')]
-
[
'FONT_HERSHEY_COMPLEX',
'FONT_HERSHEY_COMPLEX_SMALL',
'FONT_HERSHEY_DUPLEX',
'FONT_HERSHEY_PLAIN',
'FONT_HERSHEY_SCRIPT_COMPLEX',
'FONT_HERSHEY_SCRIPT_SIMPLEX',
'FONT_HERSHEY_SIMPLEX',
'FONT_HERSHEY_TRIPLEX',
'FONT_ITALIC']
-
>>>
一个变通的方法是通过pillow转换后显示中文:
-
import cv
2
-
import numpy as np
-
from PIL import Image,ImageDraw,ImageFont
-
print('VX公众号: 桔子code / juzicode.com')
-
print('cv
2.__version__:',cv
2.__version__)
-
-
img = np.full((
512,
512,
3),
255,np.uint
8)
#白色背景
-
img_pil = Image.fromarray(cv
2.cvtColor(img,cv
2.COLOR_BGR
2RGB))
-
-
text = 'VX:桔子code'
-
start = (
10,
200)
#起始位置
-
fonttype = 'msyh.ttc'
#微软雅黑字体,和具体操作系统相关
-
fontscale =
30
#字体大小
-
font = ImageFont.truetype(fonttype,fontscale)
-
draw = ImageDraw.Draw(img_pil)
-
draw.text(start,text,font=font,fill=(
255,
0,
0))
#PIL中BGR=(255,0,0)表示红色
-
img_ocv = np.array(img_pil)
#PIL图片转换为numpy
-
img = cv
2.cvtColor(img_ocv,cv
2.COLOR_RGB
2BGR)
#PIL格式转换为OpenCV的BGR格式
-
-
cv2.imshow('juzicode.com',img)
-
cv2.waitKey()
运行结果:
小结:本文介绍了怎么在图像中绘制多边形,多边形也可以用来绘制方形、三角形;OpenCV中默认不能输出中文文字,可以用过转换为PIL图片再转换回OpenCV图片的变通方法达到输出中文的目的。
扩展阅读:
转载:https://blog.csdn.net/juzicode00/article/details/117430104
查看评论