1、前记

因为opencv不能显示中文(会变成???),所以尝试通过opencv->pillow->opencv这种方式来实现,具体可参考这篇博客。

2、利用pillow展示中文

下面来简述一下使用情况:

# opencv-> pillow
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pilimg = Image.fromarray(cv2img)
'''
进行一些操作
'''
# pillow -> opencv
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)

可以显示中文了!

经过在主机上(cpu:12700F)测试
opencv与pil互转需要 2-3 ms,pil画图(目标检测的可视化,包括bbox绘制,文本输出)需要 10+ ms,算下来一帧的图像处理就在 15+ ms了,在我的主机上速度尚且可以,但是在agx上一帧的图像处理速度在 60+ ms了,达不到实时性要求。

后来,发现了一个好东西——pillow-smid,专门用来加速pillow的库,安装比较简单,见这篇博客,需要注意的是需要先卸载pillow再安装pillow-smid。在我的主机上安装十分顺利,但是在agx上pip安装会报错,具体错误如这个所示,总之就是编译错误。不过github上并没有回复,因此需要自行解决,可见本文最后部分。
——————————————————————————————————————————
pillow-smid的使用方法和pillow一模一样,原先的代码不用变。
加速效果(仅plot部分):

pillow pillow-smid opencv
主机 10+ ms 3~4 ms 2~3 ms
agx 40++ ms 21 ms左右 6~8 ms

虽然整体速度还是不如opencv,而且还需要opencv和pil互转花费额外的时间,但至少解决了中文乱码的问题,在agx上也能保证一帧15fps以上,基本满足使用要求。

如果是在ros中的项目,通过cv_bridge来收发图片,则可以省去opencv的bgr编码与pillow的rgb编码互转步骤,还可以节省少量时间(时间就是慢慢挤出来的,因此发现互转耗费时间的是numpy和Image之间type的互转)。

# numpy -> pillow
pilimg = Image.fromarray(image)
# pillow -> numpy
npimg = np.array(pilimg)

注意:虽然pillow的图片编码只支持RGB的,但是采用这种办法的图片编码取决于cv_bridge的编码,如果你接收的是BGR格式的图片,那么按照这样的处理,在plot的前中后都是BGR编码的,一定注意通道的顺序,这么做只是为了少一步通道顺序变换。虽然听起来很拗口,但是就是这么NTR,相当于把pillow当opencv用了~

3、 pillow与opencv常用函数

这里列举三个目标检测可视化的常用的函数

注意:pillow 需要提前定义画布、字体样式

from PIL import Image, ImageDraw, ImageFont
# 画布定义
draw = ImageDraw.Draw(pilimg)
# 字体样式,这步非常消耗时间,建议放在循环外面,只执行一次
font = ImageFont.truetype(font_path, 22, encoding="utf-8")

(1) 画boundbingbox

只画线框

# pillow
# “width=”需要 pillow >= 5.3.0, pillow-smid的版本与pillow的版本不一定一致,
# 比如我用源码安装的pillow-smid-7.0.0,但是里面的pil是5.1.0版本
draw.rectangle((c1,c2),fill=None,outline=color1,width=line_thickness)
# 低版本pillow替代方法,实现对线宽的控制
draw.line([(x1,y1),(x2,y1),(x2,y2),(x1,y2),(x1,y1)],  width=line_thickness, fill=color1)# opencv
cv2.rectangle(image,(x1,y1),(x2,y2),color1,thickness=tl, lineType=cv2.LINE_AA)

画实心框

# pillow
draw.rectangle((c1,c2),fill=color1,outline=None)
# opencv
cv2.rectangle(image, c1, c2, color1, cv2.FILLED)
# 或者
cv2.rectangle(image, c1, c2, color1,thickness=-1, lineType=cv2.LINE_AA)

(2) 展示文本

# pillow
draw.text((x1,y1),txt2,color1,font=font)
# opencv
cv2.putText(image, txt2, (x1,y1), 0, tl/3, color1,thickness=tf, lineType=cv2.LINE_AA)

(3) 获取文本长度

# pillow
t_size = font.getsize(txt2)
# opencv
t_size = cv2.getTextSize(txt2, 0, fontScale=tf, thickness=tf)[0]

注意:pillow和opencv的区别

  • 矩形框定位
  • pillow是两个点放在一个元组中((x1,x2),(y1,y2));
  • opencv是两个点分开放(x1,x2),(y1,y2)。
  • 颜色
  • pillow只能是元组格式(255,255,255);
  • opencv可以是列表、元组。

4、pillow-smid安装失败解决方法

windows

windows可以直接下载whl文件然后安装,window安装包链接https://www.lfd.uci.edu/~gohlke/pythonlibs/

【Python】opencv展示汉字及与pillow对比相关推荐

  1. 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化

    一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...

  2. Python OpenCV GrabCut进行前景分割和提取

    Python OpenCV GrabCut进行前景分割和提取 1. 效果图 1.1 边界框GrabCut效果图 1.2 Mask GrabCut效果图 2. GrabCut原理 2.1 GrabCut ...

  3. Python+Opencv实现多种形状的检测

    目录 一.Hough变换是什么? 二.Hough变换原理简介 三.Hough变换实现步骤 四.Hough变换直线检测代码实现及效果展示 五.Hough变换圆形检测代码实现及效果展示 六.基于Hough ...

  4. [python opencv 计算机视觉零基础到实战] 十一找到图片中指定内容

    一.学习目标 了解图片内容定位方法matchTemplate使用 了解minMaxLoc方法使用 上一篇<[python opencv 计算机视觉零基础到实战] 十.图片效果毛玻璃> 如有 ...

  5. Python+OpenCV 调用手机摄像头并实现人脸识别

    文章内容: 1.windows 环境下安装 OpenCV 机器视觉环境搭建: 2.基于通过 Python+OpenCV调用手机摄像头并实现人脸检测识别. 目录 1 实验环境 2 实验准备 2.1 下载 ...

  6. Python OpenCV开发MR智能人脸识别打卡系统(四、服务模块设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  7. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  8. 基于python opencv人脸识别的签到系统

    基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...

  9. Python OpenCV应用K均值聚类进行颜色量化

    Python OpenCV应用K均值聚类进行颜色量化 1. 效果图 2. 颜色量化是什么? 3. MiniBatchKMeans & KMeans 4. 源码 参考 在这篇博客文章中,我将向您 ...

最新文章

  1. VMWare 6.0桥接模式虚拟机网络配置
  2. javascript中最最最常用的方法封装
  3. CentOS SVN安装与配置 (RHEL5.4平台测试通过)
  4. Android使用Retrofit2.0和RxJava2.0处理网络请求
  5. POJ 计算几何入门题目推荐
  6. 三层架构-----实践篇-登录小实例
  7. 24岁博士毕业,受聘211高校副教授,90后开挂背后是自律和坚持
  8. centos 7.x systemd service 配置方法整理
  9. 【误区】技术部经理vs技术经理 —— 一字之差谬以千里
  10. aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)
  11. linux 文件管理命令
  12. Windows SharePoint Services Search和Office SharePoint Server Search的区别
  13. php之sprintf的用法,PHP之sprintf函数用法详解
  14. 《信号与系统》解读 第1章 信号与系统概述-1:信号与系统的描述和分析方法
  15. 用HTML语言编写下图所示网页,2019-02-21第一章 HTML基础
  16. 计算机专业博士后 解决北京户口,在职博士后落北京户口可以么?该如何操作
  17. 别人犯错给自己的警醒(二):人取得成就之后很容易膨胀
  18. 安卓内存数据分析和内存脚本分析教程分享
  19. 王者荣耀战力查询小程序源码下载-支持安卓ios微信和QQ战力查询支持打包成APP
  20. 回合制游戏中的活动需要注意的

热门文章

  1. 笔记1:uni-app简单创建配置路径样式tabbar页面跳转
  2. canal的java客户端_GitHub - cjl1001/canal-client: spring boot canal starter 易用的canal 客户端 canal client...
  3. 【双重注意机制:肺癌:超分】
  4. 除夕夜加班的互联网人
  5. coderwhy前端学习笔记二
  6. Elasticsearch 7.2 安装方法 及常见错误以及详细配置介绍
  7. oracle创建job和删除job
  8. unity3d 使用UMP 插件在安卓上 播放H264视频流 不显示问题
  9. 光天化日电影真实有效的吗?
  10. 采用七对策远离白内障