一、人脸检测
人脸检测主要任务是构造能够区分人脸实例(“正类”)和不包含人脸实例(“负类”)的分类器
1、基本原理
(1)级联分类器
将多个简单的分类器按照一定的顺序级联,对多个图像特征进行识别
(2)Haar级联分类器
使用Haar特征(矩阵框的垂直、水平和对角特征),在特征模板内,用白色矩形像素块的像素减去黑色矩形像素块的像素来表示该模板的特征。通过Haar特征,让不符合条件的背景图像(负样本)被快速抛弃,从而集中运算在人脸对象上。
2、代码实例
(1)普通检测人脸
def face_detect_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 获取xml文件,加载人脸检测器。haarcascade_frontalface_default.xml:正面人脸检测
face_detector = cv.CascadeClassifier('D:/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
"""
detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
self:返回值,目标对象的矩形框向量组
image:待检测图像,通常为灰度图像
scaleFactor:表示在前后两次相继的扫描中,搜索窗口的缩放比例
minNeighbors:表示构成检测目标的相邻矩形的最小个数。默认3,表示有3个以上的检测标记存在时,才认为人脸存在
flags:通常省略,低版本CV_HAAR_DO_CANNY_PRUNING表示使用canny边缘检测来拒绝一些区域
minSize:目标的最小尺寸,小于被忽略
maxSize:目标的最大尺寸,大于被忽略
"""
faces = face_detector.detectMultiScale(gray, 1.1, 5,)
# 矩形标注人脸
for x, y, w, h in faces:
cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv.imshow('face_detect_demo', image)
def video_detect_demo():
capture = cv.VideoCapture(0)
cv.namedWindow('video_detect_demo',cv.WINDOW_AUTOSIZE)
while True:
ret, frame = capture.read()
frame = cv.flip(frame,1)
face_detect_demo(frame)
c = cv.waitKey(10)
if c == 27:
break
(2)计算检测人脸个数
def faces_detect(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
faceCasde = cv.CascadeClassifier('D:/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
faces = faceCasde.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5))
print(faces)
print('发现{0}个人脸!'.format(len(faces)))
for x, y, w, h in faces:
cv.circle(image, (int((x + x + w) / 2), int((y + y + h) / 2)), int(w / 2), (0, 255, 0), 2)
cv.imshow('faces_detect', image)
>>[[441 35 47 47]
[ 92 130 54 54]
[251 147 60 60]
[ 11 102 47 47]
[491 100 52 52]
[ 65 41 51 51]
[415 109 55 55]
[331 84 65 65]
[169 84 70 70]]
发现9个人脸!
二、数字验证码识别
# 不同结构元素中选择
def recognize_text():
#1、灰度、二值图像
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
# 2、预处理-去除干扰线与点,可选
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 1)) # (5, 1)不同取值不同,识别结果不同
close_in = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
cv.imshow('close_in image', close_in)
cv.bitwise_not(close_in, close_in)
textImage1 = Image.fromarray(close_in)
text1 = tess.image_to_string(textImage1)
print('识别结果:%s' % text1)
kernel1 = cv.getStructuringElement(cv.MORPH_RECT, (1, 3)) # (1, 3)不同取值不同,识别结果不同
open_out = cv.morphologyEx(close_in, cv.MORPH_OPEN, kernel1)
cv.imshow('open_out image', open_out)
# 3、变为白色背景
cv.bitwise_not(open_out, open_out)
# 4、变为textImage图像:image与numpy array相互转换
"""
fromarray(obj, mode=None)
obj:具有数组接口的对象
mode:要使用的模式(将由类型决定,如果为None)
"""
textImage = Image.fromarray(open_out)
# 5、数字验证码识别
"""
image_to_string(
image,
lang=None,
config='',
nice=0,
output_type=Output.STRING,
timeout=0,
)
"""
text = tess.image_to_string(textImage)
print('识别结果:%s' % text)
- 第一组识别结果
识别结果:G1234
5678-
识别结果:U1234
9678.
- 第二组识别结果
识别结果:ABCDE
FGHIJ
KLHWO
PORST
UVXYZ
识别结果:FGHIJ
KLKNO
PORST
UYXYZ