人脸识别两种方法
(1)哈尔(haar)级联方法
(2)深度学习方法(DNN)
哈尔(haar)级联方法
haar是专门为解决人脸识别而推出的,且在深度学习之前,haar就已经广泛运用了。
哈尔(haar)人脸识别步骤
(1)创建haar级联器(此时需要一些训练后的数据)(如果有需要,可以后台私信我)
(2)导入图片并且灰度化(也可以使用摄像头捕捉)
(3)调用detectMultiscale方法进行人脸识别
detectMultiscale API
detectMultiscale(img,double scaleFactor=1.1,int minNeighbors=3,……)
double scaleFactor:缩放因子,由于图片可能偏大,我们扫描的框可能无法覆盖整张脸,所以此时需要进行缩放
int minNeighbors:最小像素值,人脸识别时最小的的像素
哈尔(haar)人脸识别实战
import cv2
import numpy as np
# 第一步,创建Haar级联器 导入训练好的数据
facer = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
# 第二步,传入图片
img = cv2.imread('p3.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 第三步,进行人脸识别
# 返回值faces是一个数组[[x,y,w,h]]
faces = facer.detectMultiScale(gray, 1.1, 5)
# 画框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3)
cv2.imshow('img', img)
cv2.waitKey(0)
哈尔(haar)人脸识别实战(其他脸部特征检测)
import cv2
import numpy as np
# 第一步,创建Haar级联器 导入训练好的数据
facer = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
eye = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')
# 第二步,传入图片
img = cv2.imread('p3.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 第三步,进行人脸识别
# 返回值faces是一个数组[[x,y,w,h]]
faces = facer.detectMultiScale(gray, 1.1, 5)
# 画框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3)
eyes = eye.detectMultiScale(gray, 1.1, 5)
# 画框
for (x, y, w, h) in eyes:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 3)
cv2.imshow('img', img)
cv2.waitKey(0)
其他器官的方法都是类似的,改变所创建的haar级联器,得到我们需要的目的。
此时会出现一个问题,脸是比较准确的,但是器官未必那么准确,所以我们可以将脸部器官的寻找放在脸部位置。修改改代码如下。
faces = facer.detectMultiScale(gray, 1.1, 5)
i = 0
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3)
roi_img = img[y:y + h, x:x + h] # 此时的yx的顺序不能弄反
eyes = eye.detectMultiScale(roi_img, 1.1, 5)
for (x, y, w, h) in eyes:
cv2.rectangle(roi_img, (x, y), (x + w, y + h), (255, 0, 0), 3)
i = i + 1
winname = 'face' + str(i)
cv2.imshow(winname, roi_img)
Haar+Tesseract 车牌识别
车牌识别的具体步骤
(1)通过Haar确定车牌位置
(2)对车牌进行预处理 (对车牌二值化,进行形态学处理,去噪声,缩放)
(3)用Tesseract进行文字识别
Tesseract安装
安装教程:Tesseract-OCR下载和安装,Python-OCR使用-CSDN博客
安装完可能会出现一些错误,修改方法如后:pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it‘s not in your PATH_in run_tesseract proc = subprocess.popen(cmd_args,-CSDN博客
Haar+Tesseract 车牌识别实战
import cv2
import numpy as np
import pytesseract
# ./haarcascades/haarcascade_frontalface_default.xml
# 第一步,创建Haar级联器 导入训练好的数据 #./haarcascades/haarcascade_russian_plate_number.xml
plate = cv2.CascadeClassifier(
"E:\\pycharm\\PycharmFile\\opencv\\face\\haarcascades\\haarcascade_russian_plate_number.xml")
# E:\pycharm\PycharmFile\opencv\face\haarcascades\haarcascade_russian_plate_number.xml
# 第二步,传入图片
img = cv2.imread('chinacar.jpeg')
# 第三步,车牌定位
# 返回值faces是一个数组[[x,y,w,h]]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plates = plate.detectMultiScale(gray, 1.1, 3)
i = 0
for (x, y, w, h) in plates:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 对获取的车牌进行预处理
# 1.提取ROI
roi = gray[y:y + h, x:x + w]
# 2.二值化
ret, roi_bin = cv2.threshold(roi, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print(pytesseract.image_to_string(roi, lang='chi_sim+eng', config='--psm 8 --oem 3')) # --psm 8 是分页形式
# --oem 3 是选择3的引擎
cv2.imshow('IMG', img)
cv2.imshow('roi_bin', roi_bin)
cv2.waitKey(0)
使用DNN实现图像分类
DNN使用步骤
(1)读取模型,并得到深度神经网络
(2)读取图片视频
(3)将图片转为张量,送入深度神经网络
(4)进行分析,得到结果
导入模型
readNetFromTensorflow 导入的是Tensorflow模型
readNetFromCaffe 导入的是Caffe模型
readNetDarknet,YOLO 导入的是YOLO模型
readNet 会自动识别模型
导入模型API参数
readNetFromTensorflow(model,config)
readNetFromCaffe/Darknet(config,model)
readNet(model,[config,[framework]])
读取图片API
blobFromImage(image,scalefactor=1.0,size=Size(),mean=Scale(),swapRB=False,crop=false……)
scalefactor 缩放因子
size 图像尺寸
mean 平均差值 消除输入图像中光照的变化 不同数据集有不同的规范
swapRB R B是否进行交换 由于opencv默认图像是BGR的,但是深度学习可能是RGB也可能是BGR
crop 对图像是否进行裁剪
将张量送入网络并执行API
net.setInput(blob)
net.forward()
DNN实现图像分类实战代码
import cv2
import numpy as np
from cv2 import dnn
# 1 导入模型,创建神经网络
# 2 读图片,转成张量
# 3 将张量输入到神经网络中,并进行预测
# 4 得到结果,显示
# 1 导入模型,创建神经网络
config = "./model/bvlc_googlenet.prototxt"
model = "./model/bvlc_googlenet.caffemodel"
net = dnn.readNetFromCaffe(config, model)
# 2 读图片,转成张量
img = cv2.imread('smallcat.jpeg')
blob = dnn.blobFromImage(img,
1.0, # 缩放因子
(224, 224), # caffe 要求的尺寸
(104, 117, 123))
# 3 将张量输入到神经网络中,并进行预测
net.setInput(blob) # 张量输入到神经网络中
r = net.forward() # 进行预测 r是分类后的结果,人类不可知 需要进行转换
# 4 得到结果,显示
# 读入目录
classes = []
path = './model/synset_words.txt'
with open(path, 'rt') as f:
classes = [x[x.find('') + 1:] for x in f]
order = sorted(r[0], reverse=True) # 将得到的结果进行排序 是倒叙 最可能的结果放在最前面
z = list(range(3))
for i in range(0, 3): # 找出前三项
z[i] = np.where(r[0] == order[i])[0][0]
print('第', i + 1, '项,匹配:', classes[z[i]], end='')
print('类所在行:', [i] + 1, '', '可能性:', order[i])