人脸检测与数字验证码识别

参考:
https://blog.csdn.net/weixin_48619768/article/details/108169184

使用Haar分类器进行面部检测

  1. 简单介绍Haar特征分类器对象检测技术
    它是基于机器学习的,通过使用大量的正负样本图像训练得到一个cascade_function,最后再用它来做对象检测。如果你想实现自己的面部检测分类器,需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。 可参考https://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html,这里不做介绍,现在我们利用OpenCV已经训练好的分类器,直接利用它来实现面部和眼部检测。

  2. 主要步骤:
    1)加载xml分类器,并将图像或者视频处理成灰度格式 cv.CascadeClassifier()
    2)对灰度图像进行面部检测,返回若干个包含面部的矩形区域 Rect(x,y,w,h)face_detector.detectMultiScale()
    3)创建一个包含面部的ROI,并在其中进行眼部检测

  3. 重要方法分析:def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, minSize=None, maxSize=None)
    原理:检测输入图像在不同尺寸下可能含有的目标对象
    #minSize – Minimum possible object size. Objects smaller than that are ignored.
    #maxSize – Maximum possible object size. Objects larger than that are ignored.
    入参:
    1)image:输入的图像
    2)scaleFactor:比例因子,图像尺寸每次减少的比例,要大于1,这个需要自己手动调参以便获得想要的结果
    3)minNeighbors:最小附近像素值,在每个候选框边缘最小应该保留多少个附近像素
    4)minSize,maxSize:最小可能对象尺寸,所检测的结果小于该值会被忽略。最大可能对象尺寸,所检测的结果大于该值会被忽略
    返回:若干个包含对象的矩形区域

import cv2 as cv


def face_detection(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    face_detector = cv.CascadeClassifier("./images/haarcascade_frontalface_alt_tree.xml")
    eyes_detector = cv.CascadeClassifier("./images/haarcascade_eye.xml")
    # image, scaleFactor, minNeighbors
    faces = face_detector.detectMultiScale(gray, 1.02, 5)
    for x, y, w, h in faces:
        cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # img = cv.circle(image, (x+(w//2), y+(h//2)), w//2, (0, 255, 0), 2)
        # 选择面部识别出来的区域进行eye识别
        # 浅拷贝
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = image[y:y+h, x:x+w]
        # 识别eye和mouth
        eyes = eyes_detector.detectMultiScale(roi_gray, 1.3, 5)
        # 识别出来的区域用矩形标记起来
        for ex, ey, ew, eh in eyes:
            cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
            # cv.circle(roi_color, (ex + (ew // 2), ey + (eh // 2)), ew // 2, (0, 255, 0), 2)

    cv.imshow("result", image)


def main():
    src = cv.imread("./images/CrystalLiu2.jpg")
    cv.imshow("src", src)
    face_detection(src)

    while True:
        k = cv.waitKey(10)
        if k == ord("q"):
            break

    # capture = cv.VideoCapture(0)
    # while True:
    #     ret, frame = capture.read()
    #     if not ret:
    #         break
    #     face_detection(frame)
    #
    #     k = cv.waitKey(10)
    #     if k == ord("q"):
    #         break

    cv.destroyAllWindows()


if __name__ == '__main__':
    main()

在这里插入图片描述

import cv2 as cv
from PIL import Image
import pytesseract as tess


def recognition_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    """去噪声这块可以自由发挥"""
    # 获取结构化元素
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (4, 4))
    # 开操作
    bin1 = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel=kernel)
    cv.imshow("bin1", bin1)
    # 转换为image类型
    textImage = Image.fromarray(bin1)
    print(type(textImage))
    # 进行识别并返回识别结果
    text = tess.image_to_string(textImage)

    print("The result:", text)


def main():
    src = cv.imread("./images/yzm.jpg")
    cv.imshow("demo", src)
    recognition_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/113763527