OpenCV添加文字的方法putText(...),添加英文是没有问题的,但如果你要添加中文就会出现“???”的乱码,需要特殊处理一下。
下文提供封装好的(代码)方法,供OpenCV添加中文使用。
视频人脸检测——Dlib版(六)
OpenCV添加中文(五)
图片人脸检测——Dlib版(四)
视频人脸检测——OpenCV版(三)
图片人脸检测——OpenCV版(二)
OpenCV环境搭建(一)
更多更新,欢迎访问github:https://github.com/vipstone/faceai
使用PIL的图片绘制添加中文,可以指定字体文件,那么也就是说使用PIL可以实现中文的输出。
有思路之后,接下来的工作就简单了。
OpenCV图片转换为PIL图片格式
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
使用PIL绘制文字
draw = ImageDraw.Draw(img) fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8") draw.text((left, top), "文字内容", textColor, font=fontText)
字体文件为:simsun.ttc,Windows可以在C:\Windows\Fonts下面查找。
PIL图片格式转换成OpenCV的图片格式
cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)
封装好的完整方法
#coding=utf-8 #中文乱码处理 import cv2 import numpy from PIL import Image, ImageDraw, ImageFont def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20): if (isinstance(img, numpy.ndarray)): #判断是否OpenCV图片类型 img = Image.fr
视频人脸检测——Dlib版(六)
OpenCV添加中文(五)
图片人脸检测——Dlib版(四)
视频人脸检测——OpenCV版(三)
图片人脸检测——OpenCV版(二)
OpenCV环境搭建(一)
更多更新,欢迎访问github:https://github.com/vipstone/faceai
实现思路:
调用电脑的摄像头,把摄像的信息逐帧分解成图片,基于图片检测标识出人脸的位置,把处理的图片逐帧绘制给用户,用户看到的效果就是视频的人脸检测。
效果预览:
使用OpenCV调用摄像头并展示
获取摄像头:
1 | cap = cv2.VideoCapture( 0 ) |
参数0表示,获取第一个摄像头。
显示摄像头 逐帧显示,代码如下:
1 2 3 4 5 6 7 | while ( 1 ): ret, img = cap.read() cv2.imshow( "Image" , img) if cv2.waitKey( 1 ) & 0xFF = = ord ( 'q' ): break cap.release() # 释放摄像头 cv2.destroyAllWindows() # 释放窗口资源 |
cv2.waitKey(1) & 0xFF使用了“&”位元算法,含义是获取用户输入的最后一个字符的ASCII码,如果输入的是“q”,则跳出循环。
视频的人脸识别
这个时候,用到了上一节的《图片人脸检测——OpenCV版(二)》 把人脸识别的代码封装成方法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | def discern(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cap = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml" ) faceRects = cap.detectMultiScale( gray, scaleFactor = 1.2 , minNeighbors = 3 , minSize = ( 50 , 50 )) if len (faceRects): for faceRect in faceRects |
此环境搭建是OpenCV的python(一下简称py)开发环境搭建,建立在py3的环境和语法上实现的。
系统环境:windows 10 + python 3.6 + OpenCV 3.4.1
python的安装之前在python自学笔记的项目中描述了,在这不做重复说明,有需要的朋友,点击查看:python环境安装
根据上文提示,现在我们已经正确安装了python和pip(安装和管理python包的工具),在正式安装OpenCV之前,首先我们要安装numpy模块。 numpy:是一个定义了数值数组和矩阵类型和它们的基本运算的语言扩展,OpenCV引用了numpy模块,所以安装OpenCV之前必须安装numpy。
本文安装python模块使用的是.whl文件安装的。
whl文件是什么?
whl是一个python的压缩包,其中包含了py文件以及经过编译的pyd文件。
whl安装命令
pip install 存放路径\xxx.whl
回到主题,我们是要安装numpy模块的。
首先去网站下载对应的numpy版本,下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 本人是64为系统python3.6所以对应的最新版本是:numpy‑1.14.2+mkl‑cp36‑cp36m‑win_amd64.whl,点击下载到D:根目录。
第2步,启动命令窗体运行
pip install d:\numpy‑1.14.2+mkl‑cp36‑cp36m‑win_amd64.whl
命令窗体显示:
Processing d:\numpy-1.14.2+mkl-cp36-cp36m-win_amd64.whl
Installing collected packages: numpy
Successfully installed numpy-1.14.2+mkl
说明已经安装成功。
同样安装OpenCV模块和numpy方式类似,实现去网站下载OpenCV对于的.whl版本压缩包,网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv 本人下载的版本是:opencv_python‑3.4.1‑cp36‑cp36m‑win_amd64.whl 64位
Dlib的人脸识别要比OpenCV精准很多,一个是模型方面的差距,在一方面和OpenCV的定位有关系,OpenCV是一个综合性的视觉处理库,既然这么精准,那就一起赶快来看吧。
视频人脸检测是图片识别的高级版本,图片检测详情点击查看我的上一篇《图片人脸检测——Dlib版(四)》
除了人脸识别用的是Dlib外,还是用OpenCV读取摄像头和处理图片(转为灰色),所以给出相关的文档,方便理解。
视频人脸检测——Dlib版(六)
OpenCV添加中文(五)
图片人脸检测——Dlib版(四)
视频人脸检测——OpenCV版(三)
图片人脸检测——OpenCV版(二)
OpenCV环境搭建(一)
更多更新,欢迎访问github:https://github.com/vipstone/faceai
有了OpenCV的视频人脸检测,Dlib也大致相同除了视频识别器模型的声明和使用不同,具体的细节请参考,视频人脸检测——OpenCV版(三) 那篇已经讲的很细致了,在这就不具体叙述了。
完整的代码如下:
# coding=utf-8 import cv2 import dlib detector = dlib.get_frontal_face_detector() #使用默认的人类识别器模型 def discern(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) dets = detector(gray, 1) for face in dets: left = face.left() top = face.top() right = face.right() bottom = face.bottom() cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 2) cv2.imshow("image", img) cap = cv2.VideoCapture(0) while (1): ret, img = cap.read() discern(img) if cv2.waitKey(1) & 0xFF ==
视频人脸检测——Dlib版(六)
OpenCV添加中文(五)
图片人脸检测——Dlib版(四)
视频人脸检测——OpenCV版(三)
图片人脸检测——OpenCV版(二)
OpenCV环境搭建(一)
更多更新,欢迎访问github:https://github.com/vipstone/faceai
识别一种图上的所有人的脸,并且标出人脸的位置,画出人眼以及嘴的位置,展示效果图如下:
多张脸识别效果图:
图片转换成灰色(去除色彩干扰,让图片识别更准确)
图片上画矩形
使用训练分类器查找人脸
图片转换成灰色
使用OpenCV的cvtColor()转换图片颜色,代码如下:
1 2 3 4 5 6 7 8 9 10 | import cv2 filepath = "img/xingye-1.jpg" img = cv2.imread(filepath) # 转换灰色 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 显示图像 cv2.imshow( "Image" , gray) cv2.waitKey( 0 ) cv2.destroyAllWindows() |
图片上画矩形
使用OpenCV的rectangle()绘制矩形,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | import cv2 filepath = "img/xingye-1.jpg" img = cv2.imread(filepath) # 读取图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色 x = y = 10 # 坐标 w = 100 # 矩形大小(宽、高) color = ( 0 , 0 , 255 ) # 定义绘制颜色 cv2.rectangle(img, (x, y), (x + w, y + w), color, 1 ) # 绘制矩形 cv2.imshow( "Image" , img) # 显示图像 cv2.waitKey( 0 ) cv2.destroyAllWindows() # 释放所有的窗体资源 |
使用训练分类器查找人脸
在使用OpenCV的人脸检测之前,需要一个人脸训练模型,格式是xml的,我们这里使用OpenCV提供好的人脸分类模型xml,下载地址:https://github.com/opencv/opencv/tree/master/da
视频人脸检测——Dlib版(六)
OpenCV添加中文(五)
图片人脸检测——Dlib版(四)
视频人脸检测——OpenCV版(三)
图片人脸检测——OpenCV版(二)
OpenCV环境搭建(一)
更多更新,欢迎访问github:https://github.com/vipstone/faceai
识别精准度:Dlib >= OpenCV
Dlib更多的人脸识别模型,可以检测脸部68甚至更多的特征点
人脸的68个特征点
下载地址:https://pypi.org/simple/dlib/ 选择适合你的版本,本人配置:
Window 10 + Python 3.6.4
我现在的版本是:dlib-19.8.1-cp36-cp36m-win_amd64.whl
使用命令安装:
pip3 install D:\soft\py\dlib-19.8.1-cp36-cp36m-win_amd64.whl
显示结果: Processing d:\soft\py\dlib-19.8.1-cp36-cp36m-win_amd64.whl Installing collected packages: dlib Successfully installed dlib-19.8.1
为安装成功。
训练模型用于是人脸识别的关键,用于查找图片的关键点。
下载文件:shape_predictor_68_face_landmarks.dat.bz2
当然你也可以训练自己的人脸关键点模型,这个功能会放在后面讲。
下载好的模型文件,我的存放地址是:C:\Python36\Lib\site-packages\dlib-data\shape_predictor_68_face_landmarks.dat.bz2
解压:shape_predictor_68_face_landmarks.dat.bz2得到文件:shape_predictor_68_face_landmarks.dat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #coding=utf-8 import cv2 import dlib path = "img/meinv.png" img = cv2.imread(p |