应用——人脸检测和数字验证码识别

一、人脸检测

人脸检测主要任务是构造能够区分人脸实例(“正类”)和不包含人脸实例(“负类”)的分类器

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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值