【OpenCV】(十六)人脸检测和车牌识别
系列内容:OpenCV概述与环境配置,OpenCV基础知识和绘制图形,图像的算数与位运算,图像视频的加载和显示,图像基本变换,滤波器,形态学,图像轮廓,图像直方图,车辆统计项目,特征检测和匹配,图像查找和拼接,虚拟计算器项目,信用卡识别项目,图像的分割与修复,人脸检测与车牌识别,目标追踪,答题卡识别判卷与文档ocr扫描识别,光流估计
(一)人脸检测
首先我们要搞清楚人脸检测中的一些概念.
- 人脸检测: 在一张图像中判断是否存在人脸并找出人脸所在的位置
- 人脸识别: 在人脸检测的基础上收集人脸数据集合进行处理保存信息,将输入人脸与保存的信息进行比对校验,得到是否为其中某个人脸
- 特征值: 以某种特定规则对输入源进行处理得到具有唯一性质量化的值,在人脸识别中特征值的提取有HOG-方向梯度直方图,HAAR-like特征,LBP-局部二进制模式 三种方法.
- 分类器: 根据特征值界定事物是否属于已知某种类别的过滤条件组合,未知类别的算聚类器,弱分类器: 分类器的正确率高于随机分类(50\%),强分类器: 能满足预期分类并且正确率很高的分类器.
- Adaboost: 迭代算法,同一个训练集合下训练多个弱分类器,把弱分类器迭代组合成一个强分类器.
- 级联分类器: 将多个同类型的分类器联合起来进行推算整合以得到符合目标的最终分类器的方法.
分类器生成及使用
一个高准确率的级联分类器的主要生成步骤如下:
- 1.大量样本集合,特征值的提取
- 2.通过adaboost训练多个弱分类器并迭代为强分类器
- 3.多层级联强分类器,得到最终的级联分类器
这些训练流程完成之后结果以xml的方式保存起来,就是分类器文件,opencv中包含了以上的实现,并且已经存放了许多已经训练好的不同类型的不同特征值提取生成的级联分类器,Opencv中可以直接加载这些分类器文件,并且给出了便捷的API
CascadeClassifier
- 参数1:image—待检测图片,一般为灰度图像加快检测速度;
- 参数2:objects—被检测物体的矩形框向量组;
- 参数3:scaleFactor—表示在前后两次相继的扫描中,图像被缩放的比例,1.1即每次缩放10\% 用于检测
- 参数4:minNeighbors—表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上(使用默认值即可)
- 参数5:flags—要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因为这些区域通常不会是人脸所在区域;
- 参数6、7:minSize和maxSize用来限制得到的目标区域的范围。
示例代码(世界物理学家大会):
1.正脸模型
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('./face03.jpg')
#变成黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#创建haar级联器
#正脸
face=cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
#检测人脸
faces=face.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=4)
# print(type(faces))
# print(faces)
#画出检测的人脸框
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
正脸模型识别效果,如图16.1所示:
2.alt2模型
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('./face03.jpg')
#变成黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#创建haar级联器
#正脸alt2
face=cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
#检测人脸
faces=face.detectMultiScale(gray)
# print(type(faces))
# print(faces)
#画出检测的人脸框
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
alt2模型识别效果,如图16.2所示:
(二)人眼检测
示例代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('./lena.jpg')
#变成黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#创建haar级联器
#正脸alt2
face=cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
eye=cv2.CascadeClassifier('./haarcascade_eye.xml')
#检测人脸
faces=face.detectMultiScale(gray)
#画出检测的人脸框
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
#在人脸框内检测眼睛
roi_img=img[y:y+h,x:x+w]
eyes=eye.detectMultiScale(roi_img)
#画出检测的人眼框
for (ox,oy,ow,oh) in eyes:
cv2.rectangle(roi_img,(ox,oy),(ox+ow,oy+oh),(0,255,0),2)
roi_eye=roi_img[oy:oy+oh,ox:ox+ow]
img[y:y+h,x:x+w]=roi_img
cv2.imshow('eye',roi_eye)
# cv2.imshow('eye',roi_img)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
人眼检测结果如图16.3所示:
(三)车牌识别
我们可以利用opencv提供的车牌检测功能把车牌检测出来,然后进行形态学处理消除一些噪声,最后使用tesseract进行车牌识别.
tesseract安装
- 苹果: brew install tesseract tesseract-lang
- ubantu: apt install tesseract tesseract-lang
- windows: 网上下载tesseract安装包.
安装完成后需要设置环境变量.
- 在系统path路径中添加tesseract的路径.
- 添加名为TESSDATA_PREFIX的系统变量
示例代码:
1.车牌灰度图提取和增强
import cv2
import numpy as np
img=cv2.imread('./car.jpg')
#变成黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#创建haar级联器
car=cv2.CascadeClassifier('./haarcascade_russian_plate_number.xml')
cars=car.detectMultiScale(gray)
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
roi=gray[y:y+h,x:x+w]
#进行形态学操作
#二值化
ret,roi_bin=cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow('roi',roi_bin)
#开操作
# kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
kernel=np.ones(shape=(3,3),dtype=np.uint8)
roi=cv2.morphologyEx(roi_bin,cv2.MORPH_OPEN,kernel)
cv2.imshow('roi2',roi)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
车牌灰度图提取和增强,结果如图16.4所示:
2.tesseract车牌文字提取.
import cv2
import numpy as np
import pytesseract
img=cv2.imread('./car02.jpg')
#变成黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#创建haar级联器
car=cv2.CascadeClassifier('./haarcascade_russian_plate_number.xml')
cars=car.detectMultiScale(gray)
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
roi=gray[y:y+h,x:x+w]
#进行形态学操作
#二值化
ret,roi_bin=cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow('roi',roi_bin)
#开操作
# kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
kernel=np.ones(shape=(3,3),dtype=np.uint8)
roi=cv2.morphologyEx(roi_bin,cv2.MORPH_OPEN,kernel,iterations=1)
cv2.imshow('roi2',roi)
print(pytesseract.image_to_string(roi,lang='eng',config='--psm 8 --oem 3'))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
文字结果:[UFz021c8
tesseract车牌文字提取,结果如图16.5所示:
更多推荐
所有评论(0)