opencv_人脸检测和车牌识别

文章介绍了使用OpenCV库进行人脸检测,特别是物理学家级联分类器的应用,包括眼睛检测的精确区域定位,以及车牌识别过程中的预处理和OCR技术。重点讲解了级联分类器的生成和使用,如Adaboost算法训练弱分类器形成强分类器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人脸检测

首先我们要搞清楚人脸检测中的一些概念.

人脸检测: 在一张图像中判断是否存在人脸,并找出人脸所在的位置

人脸识别: 在人脸检测的基础上,保存收集到的人脸信息,将输入人脸与保存的信息进行比对,得到该人脸具体是哪个人。

特征值: 用某种算法,找到人脸图片的特征,在人脸识别中特征值的提取有

HOG-方向梯度直方图 , HAAR-like特征 , LBP-局部二进制模式 三种方法.

分类器: 根据特征值,界定输入事物是否属于某个类别

弱分类器:分类器的正确率高于随机分类(50%),强分类器:能满足预期分类并且正确率很高的分类器.

Adaboost: 迭代算法,同一个训练集合下训练多个弱分类器,把弱分类器迭代组合成一个强分类器.

级联分类器: 将多个同类型的分类器联合起来进行推算整合,以得到符合目标的最终分类器的方法.

分类器生成及使用

一个高准确率的级联分类器的主要生成步骤如下:

1.大量样本集合,特征值的提取

2.通过adaboost 训练多个弱分类器并迭代为强分类器

3.多层级联强分类器,得到最终的级联分类器

4.这些训练流程完成之后结果以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用来限制得到的目标区域的范围。

初步使用

import numpy as np
import cv2
# 读取图片
img = cv2.imread('./data/p3.png')

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建haar级联器
face = cv2.CascadeClassifier('./data/haarcascade_frontalface_default.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)
    
cv2.imshow('img', img)

cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

-1

物理学家的人脸检测

### 世界物理合照图片人脸检测
img = cv2.imread('./data/322a1792fb4fd575aaf6fa809607aa82.jpg')

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建haar级联器
face = cv2.CascadeClassifier('./data/haarcascade_frontalface_alt2.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)
    
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

-1

检测眼睛

### 检测眼睛
img = cv2.imread('./data/p3.png')

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建haar级联器
face = cv2.CascadeClassifier('./data/haarcascade_frontalface_default.xml')
eye = cv2.CascadeClassifier('./data/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)
        
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

-1

车牌识别

import pytesseract

# 读取车辆图片
img = cv2.imread('./data/chinacar.jpeg')

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建haar级联器
car = cv2.CascadeClassifier('./data/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)
    
    # 开操作:先腐蚀,后膨胀,去除噪点
    kernel = np.ones(shape=(3, 3), dtype=np.uint8) # 矩形核
    roi = cv2.morphologyEx(roi_bin, cv2.MORPH_OPEN, kernel, iterations=1)
    
    print(pytesseract.image_to_string(roi, lang='chi_sim+eng', config='--psm 8 --oem 3'))
    
cv2.imshow('img', img)

cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

*G5N555

-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

¥骁勇善战¥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值