【Python】opencv展示汉字及与pillow对比
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对比相关推荐
- 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化
一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...
- Python OpenCV GrabCut进行前景分割和提取
Python OpenCV GrabCut进行前景分割和提取 1. 效果图 1.1 边界框GrabCut效果图 1.2 Mask GrabCut效果图 2. GrabCut原理 2.1 GrabCut ...
- Python+Opencv实现多种形状的检测
目录 一.Hough变换是什么? 二.Hough变换原理简介 三.Hough变换实现步骤 四.Hough变换直线检测代码实现及效果展示 五.Hough变换圆形检测代码实现及效果展示 六.基于Hough ...
- [python opencv 计算机视觉零基础到实战] 十一找到图片中指定内容
一.学习目标 了解图片内容定位方法matchTemplate使用 了解minMaxLoc方法使用 上一篇<[python opencv 计算机视觉零基础到实战] 十.图片效果毛玻璃> 如有 ...
- Python+OpenCV 调用手机摄像头并实现人脸识别
文章内容: 1.windows 环境下安装 OpenCV 机器视觉环境搭建: 2.基于通过 Python+OpenCV调用手机摄像头并实现人脸检测识别. 目录 1 实验环境 2 实验准备 2.1 下载 ...
- Python OpenCV开发MR智能人脸识别打卡系统(四、服务模块设计)
需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...
- Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储
原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...
- 基于python opencv人脸识别的签到系统
基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...
- Python OpenCV应用K均值聚类进行颜色量化
Python OpenCV应用K均值聚类进行颜色量化 1. 效果图 2. 颜色量化是什么? 3. MiniBatchKMeans & KMeans 4. 源码 参考 在这篇博客文章中,我将向您 ...
最新文章
- VMWare 6.0桥接模式虚拟机网络配置
- javascript中最最最常用的方法封装
- CentOS SVN安装与配置 (RHEL5.4平台测试通过)
- Android使用Retrofit2.0和RxJava2.0处理网络请求
- POJ 计算几何入门题目推荐
- 三层架构-----实践篇-登录小实例
- 24岁博士毕业,受聘211高校副教授,90后开挂背后是自律和坚持
- centos 7.x systemd service 配置方法整理
- 【误区】技术部经理vs技术经理 —— 一字之差谬以千里
- aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)
- linux 文件管理命令
- Windows SharePoint Services Search和Office SharePoint Server Search的区别
- php之sprintf的用法,PHP之sprintf函数用法详解
- 《信号与系统》解读 第1章 信号与系统概述-1:信号与系统的描述和分析方法
- 用HTML语言编写下图所示网页,2019-02-21第一章 HTML基础
- 计算机专业博士后 解决北京户口,在职博士后落北京户口可以么?该如何操作
- 别人犯错给自己的警醒(二):人取得成就之后很容易膨胀
- 安卓内存数据分析和内存脚本分析教程分享
- 王者荣耀战力查询小程序源码下载-支持安卓ios微信和QQ战力查询支持打包成APP
- 回合制游戏中的活动需要注意的
热门文章
- 笔记1:uni-app简单创建配置路径样式tabbar页面跳转
- canal的java客户端_GitHub - cjl1001/canal-client: spring boot canal starter 易用的canal 客户端 canal client...
- 【双重注意机制:肺癌:超分】
- 除夕夜加班的互联网人
- coderwhy前端学习笔记二
- Elasticsearch 7.2 安装方法 及常见错误以及详细配置介绍
- oracle创建job和删除job
- unity3d 使用UMP 插件在安卓上 播放H264视频流 不显示问题
- 光天化日电影真实有效的吗?
- 采用七对策远离白内障
一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...
Python OpenCV GrabCut进行前景分割和提取 1. 效果图 1.1 边界框GrabCut效果图 1.2 Mask GrabCut效果图 2. GrabCut原理 2.1 GrabCut ...
目录 一.Hough变换是什么? 二.Hough变换原理简介 三.Hough变换实现步骤 四.Hough变换直线检测代码实现及效果展示 五.Hough变换圆形检测代码实现及效果展示 六.基于Hough ...
一.学习目标 了解图片内容定位方法matchTemplate使用 了解minMaxLoc方法使用 上一篇<[python opencv 计算机视觉零基础到实战] 十.图片效果毛玻璃> 如有 ...
文章内容: 1.windows 环境下安装 OpenCV 机器视觉环境搭建: 2.基于通过 Python+OpenCV调用手机摄像头并实现人脸检测识别. 目录 1 实验环境 2 实验准备 2.1 下载 ...
需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...
原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...
基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...
Python OpenCV应用K均值聚类进行颜色量化 1. 效果图 2. 颜色量化是什么? 3. MiniBatchKMeans & KMeans 4. 源码 参考 在这篇博客文章中,我将向您 ...