小言_互联网的博客

OpenCV-Python教程:绘制多边形、输出文字(polylines,putText,解决中文乱码问题)

357人阅读  评论(0)

原文链接:http://www.juzicode.com/archives/5575

返回Opencv-Python教程

在 OpenCV-Python教程:绘制直线、圆形、方形 一文中介绍了怎么绘制直线、圆形、方形,这里介绍下怎么绘制多边形、输出文字。

1、多边形

  cv2.polylines()用来画多边形。

  • 第1个参数为图像对象;
  • 第2个参数为包含一个三元组元素的列表,包含了多边形的各个顶点;
  • 第3个参数为Bool型参数表示是否闭合;
  • 第4个参数为颜色;
  • 第5个参数为线条宽度,注意不能使用-1表示填充;

方形可以看做是一种特殊的多边形,知道其4个顶点的坐标也可以利用polylines()画出方形。下面这个例子利用polylines()画出一个方形和五角星:


  
  1. import cv2
  2. import numpy as np
  3. print( 'VX公众号: 桔子code / juzicode.com')
  4. print( 'cv2.__version__:',cv2.__version__)
  5. img = np.ones(( 512, 512, 3)) #白色背景
  6. color=( 0, 255, 0) #绿色
  7. #五角星
  8. pts = np. array([[ 70, 190],[ 222, 190],[ 280, 61],[ 330, 190],[ 467, 190],
  9. [ 358, 260],[ 392, 380],[ 280, 308],[ 138, 380],[ 195, 260]])
  10. pts = pts.reshape(( -1, 1, 2)) #reshape为10x1x2的numpy
  11. print(pts.shape) # (10, 1, 2)
  12. cv2.polylines(img,[pts], True,color, 5)
  13. #方形
  14. pts = np. array([[ 10, 50],[ 100, 50],[ 100, 100],[ 10, 100]])
  15. pts = pts.reshape(( -1, 1, 2))
  16. cv2.polylines(img,[pts], True,color, 3)
  17. cv2.imshow( 'juzicode.com',img)
  18. cv2.waitKey()

运行结果:

2、输出文字

   cv2.putText()用来输出文字。

  • 第1个参数为图像对象;
  • 第2个参数为要输出的字符串;
  • 第3个参数为起始点位置;
  • 第4个参数为字体;
  • 第5个参数为字体大小;
  • 第6个参数为颜色;
  • 第7个参数为线条宽度,默认为1;
  • 第8个参数为线型,默认为LINE8;

  
  1. import cv 2
  2. import numpy as np
  3. print('VX公众号: 桔子code / juzicode.com')
  4. print('cv 2.__version__:',cv 2.__version__)
  5. img = np.ones(( 512, 512, 3)) #白色背景
  6. text = 'VX:juzicode'
  7. start = ( 10, 200)
  8. font = cv 2.FONT_HERSHEY_SIMPLEX
  9. fontscale = 2
  10. color=( 0, 0, 255) #红色
  11. thick = 2
  12. linetype = cv 2.LINE_AA
  13. cv2.putText(img,text,start, font, fontscale, color,thick,linetype)
  14. cv2.imshow('juzicode.com',img)
  15. cv2.waitKey()

运行结果:

上面的例子是输出英文,我们试下包含中文的情况,将text内容修改为“VX:桔子code”,输出乱码了:

通过dir()命令可以将所有FONT开头的内容打印出来,OpenCV中并没有包含中文字体:


  
  1. >>> cv2.__version_ _
  2. '4.5.2'
  3. >>>
  4. >>> [i for i in dir(cv2) if i.startswith( 'FONT')]
  5. [ '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']
  6. >>>

一个变通的方法是通过pillow转换后显示中文:


  
  1. import cv 2
  2. import numpy as np
  3. from PIL import Image,ImageDraw,ImageFont
  4. print('VX公众号: 桔子code / juzicode.com')
  5. print('cv 2.__version__:',cv 2.__version__)
  6. img = np.full(( 512, 512, 3), 255,np.uint 8) #白色背景
  7. img_pil = Image.fromarray(cv 2.cvtColor(img,cv 2.COLOR_BGR 2RGB))
  8. text = 'VX:桔子code'
  9. start = ( 10, 200) #起始位置
  10. fonttype = 'msyh.ttc' #微软雅黑字体,和具体操作系统相关
  11. fontscale = 30 #字体大小
  12. font = ImageFont.truetype(fonttype,fontscale)
  13. draw = ImageDraw.Draw(img_pil)
  14. draw.text(start,text,font=font,fill=( 255, 0, 0)) #PIL中BGR=(255,0,0)表示红色
  15. img_ocv = np.array(img_pil) #PIL图片转换为numpy
  16. img = cv 2.cvtColor(img_ocv,cv 2.COLOR_RGB 2BGR) #PIL格式转换为OpenCV的BGR格式
  17. cv2.imshow('juzicode.com',img)
  18. cv2.waitKey()

 运行结果:

 

小结:本文介绍了怎么在图像中绘制多边形,多边形也可以用来绘制方形、三角形;OpenCV中默认不能输出中文文字,可以用过转换为PIL图片再转换回OpenCV图片的变通方法达到输出中文的目的。

 

扩展阅读:

  1. OpenCV-Python教程
  2. OpenCV-Python教程:绘制直线、圆形、方形

转载:https://blog.csdn.net/juzicode00/article/details/117430104
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场