10 OpenCV图像识别之人脸追踪

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 级联分类器的核心思想是使用多个分类器级联,每个分类器负责检测不同的特征,逐步排除不可能是目标的区域,从而减少计算量和误检率,提高检测效率。级联分类器通常由多个弱分类器组成,这些弱分类器的输出被级联在一起形成强分类器,因此级联分类器也被称为“弱分类器的级联”。

CV2中内置了人脸识别等常用的算法,这类算法是通过级联分类器实现的。


1 级联分类器

级联分类器的核心思想是使用多个分类器级联,每个分类器负责检测不同的特征,逐步排除不可能是目标的区域,从而减少计算量和误检率,提高检测效率。级联分类器通常由多个弱分类器组成,这些弱分类器的输出被级联在一起形成强分类器,因此级联分类器也被称为“弱分类器的级联”。


在OpenCV中,级联分类器使用的Haar特征是一种基于矩形区域的特征,用于描述物体的边缘、角、线等。Adaboost算法用于训练分类器,它是一种迭代算法,每一轮迭代都会选出最优的特征和阈值进行分类器训练。


级联分类器在人脸检测等领域有着广泛的应用,因为它能够快速准确地识别目标,并且可以通过调整参数来平衡检测速度和准确度。但是,级联分类器也存在一些局限性,比如对于光照、姿态、遮挡等变化较大的情况,检测效果可能不理想。


级联分类器存储在cv2包下faeb5866bb8467e6e207a9f56e11cb61.png的data中:







每个分类器都针对特定的物体或场景进行了优化。以下是一些常用的级联分类器及其作用:


Haar人脸分类器(haarcascade_frontalface_default.xml):用于检测图像中的人脸,是OpenCV中最常用的级联分类器之一。

Haar眼睛分类器(haarcascade_eye.xml):用于检测人脸中的眼睛。

Haar上半身分类器(haarcascade_upperbody.xml):用于检测图像中的上半身,包括头、肩膀和胸部。

Haar全身分类器(haarcascade_fullbody.xml):用于检测图像中的整个人体,包括头、肩膀、胸部、腰部、腿和脚。

Haar汽车分类器(haarcascade_car.xml):用于检测图像中的汽车。

Haar行人分类器(haarcascade_pedestrian.xml):用于检测图像中的行人,适用于行人检测和跟踪等场景。

除了以上列举的常用分类器,还有一些其他分类器,如针对摩托车、猫、狗、手部、火焰等物体或场景的分类器。值得注意的是,这些分类器都是基于Haar特征和Adaboost算法构建的,因此对于复杂场景或要检测的物体形态较为复杂的情况,可能需要使用其他类型的物体检测算法或自行训练分类器来获得更好的检测效果。


2 人脸跟踪

2.1 相关方法

在CV2中,涉及的操作分别为导入分类器(CascadeClassifier方法)与使用分类器(分类器下的detectMultiScale方法)。

其中导入方法比较简单:

cascade = cv2.CascadeClassifier("xml文件路径")

1

导入后使用分类器的detectMultiScale方法进行图像识别:

objects = cascade.detectMultiScale(image, scaleFactor=1.1, minNeighbors=3, flags=0, minSize=None, maxSize=None)
1

其中,cascade是cv2.CascadeClassifier对象,image是要检测的图像。该方法返回一个由检测到的物体的矩形框组成的numpy数组。


其他可选参数解释如下:


scaleFactor:每次图像缩小的比例。默认为1.1,即每次图像缩小10%。

minNeighbors:控制误检测率的阈值。默认为3,表示每个候选矩形框周围至少需要有3个相邻的矩形框才能被认为是真正的矩形框。

flags:用于控制级联分类器的行为。可以是以下值之一:

cv2.CASCADE_SCALE_IMAGE:缩放图像以适应每个尺度。

cv2.CASCADE_DO_ROUGH_SEARCH:使用粗略的搜索模式。

cv2.CASCADE_FIND_BIGGEST_OBJECT:只返回最大的物体。

cv2.CASCADE_DO_CANNY_PRUNING:使用Canny边缘检测器进行物体检测。

cv2.CASCADE_DO_MEDIAN_BLUR:对图像进行中值模糊处理。

minSize:指定检测到的物体的最小尺寸,可以是元组或列表。默认为None,表示没有最小尺寸限制。

maxSize:指定检测到的物体的最大尺寸,可以是元组或列表。默认为None,表示没有最大尺寸限制。

detectMultiScale方法返回的矩形框是一个numpy数组,每行对应一个检测到的物体,四列分别表示矩形框的x坐标、y坐标、宽度和高度。可以使用循环遍历该数组,对图像中检测到的物体进行进一步处理,例如在物体周围画一个矩形框,或者将其提取出来用于后续处理。


2.2 代码示例

import cv2    
img = cv2.imread("zuiguifanju.jpg") 
# 加载识别人脸的级联分类器  
faceCascade = cv2.CascadeClassifier(r"D:\Python\Anaconda3\lib\site-packages\cv2\data\haarcascade_frontalface_default.xml")  
faces = faceCascade.detectMultiScale(img, maxSize=[100,100])  # 识别出所有人脸,最大不超过100*100(提升识别准确率)  
for (x, y, w, h) in faces:  # 遍历人脸区  
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)  
cv2.imshow("img", img)  
cv2.waitKey()  
cv2.destroyAllWindows()




b89ca6665bc5631b43b8ecf0788f27f2.png



同时,可以给大佬们带上个帅气的墨镜:


import cv2  
# 覆盖图像  
def overlay_img(img, img_over, img_over_x, img_over_y):  
    """  
    覆盖图像  
    :param img: 背景图像  
    :param img_over: 覆盖的图像  
    :param img_over_x: 覆盖图像在背景图像上的横坐标  
    :param img_over_y: 覆盖图像在背景图像上的纵坐标  
    :return: 两张图像合并之后的图像  
    """    img_h, img_w, img_p = img.shape  # 背景图像宽、高、通道数  
    img_over_h, img_over_w, img_over_c = img_over.shape  # 覆盖图像高、宽、通道数  
    if img_over_c == 3:  # 通道数小于等于3,则转换成4通道图像  
        img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)  
    for w in range(0, img_over_w):  
        for h in range(0, img_over_h):  
            if img_over[h, w, 3] != 0:  # 如果不是透明的像素  
                print(img_over[h, w, 3])  
                for c in range(0, 3):  
                    x = img_over_x + w  
                    y = img_over_y + h  
                    if x >= img_w or y >= img_h:  # 如果坐标超出最大宽高则不画  
                        break  
                    alpha = img_over[h, w, 3] / 255.0  # 计算alpha通道值  
                    img[y, x, c] = alpha * img_over[h, w, c] /+ (1 - alpha) * img[y, x, c]  # 覆盖像素  
    return img  
face_img = cv2.imread("zuiguifanju.jpg")  
glass_img = cv2.imread("glass.png", cv2.IMREAD_UNCHANGED)  
height, width, channel = glass_img.shape  
# 加载级联分类器  
face_cascade = cv2.CascadeClassifier(r"D:\Python\Anaconda3\lib\site-packages\cv2\data\haarcascade_frontalface_default.xml")  
faces = face_cascade.detectMultiScale(face_img, maxSize=[100,100])  # 识别人脸  
for (x, y, w, h) in faces:  
    gw = w  # 眼镜缩放之后的宽度  
    gh = int(height * w / width)  # 眼镜缩放之后的高度度  
    glass_img = cv2.resize(glass_img, (gw, gh))  # 按照人脸大小缩放眼镜  
    overlay_img(face_img, glass_img, x, y + int(h * 1 / 3))  # 将眼镜绘制到人脸
cv2.imshow("screen", face_img)  
cv2.waitKey()  
cv2.destroyAllWindows()


上面的代码主要思路是利用一个自定义函数overlay_img来实现图像的覆盖,函数的输入参数是背景图像img,覆盖的图像img_over,以及img_over在img中的坐标img_over_x和img_over_y。函数的返回值是两张图像合并之后的图像。


在函数内部,首先获取背景图像和覆盖图像的宽、高、通道数。如果覆盖图像的通道数小于等于3,就将其转换成4通道图像。然后遍历覆盖图像的所有像素,如果当前像素不是透明像素(alpha通道不为0),就计算alpha通道值,然后根据该值对覆盖像素和背景像素进行加权求和,得到最终的像素值。


在主程序中,首先读取人脸图像和眼镜图像,并使用级联分类器检测人脸。然后遍历所有人脸的区域,按照人脸大小缩放眼镜图片,并调用overlay_img函数将眼镜图片覆盖在人脸图片上。最后显示最终处理的效果。





bd9d5f894d5299de94c2fa49415a374f.png


相关文章
|
13天前
|
机器学习/深度学习 人工智能 算法
|
计算机视觉 Python
11 OpenCV图像识别之人脸识别
Eigenfaces是一种基于PCA(Principal Component Analysis,主成分分析)的人脸识别方法,属于OpenCV中的特征脸方法之一。该方法将人脸图像转换为低维的特征向量,使用PCA降维的方式提取出训练集中的主成分特征,进而提取出人脸图像的特征向量。在进行识别时,通过比较输入图像与训练集中每个图像的特征向量的相似度来判断其所属的人脸类别。
|
计算机视觉 C++
【OpenCv • c++】图像识别边缘检测 图像差分运算
【OpenCv • c++】图像识别边缘检测 图像差分运算
295 0
|
计算机视觉 Python 容器
Python黑科技:50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识别+人脸识别+大神讲解
嗨,我最亲爱的伙计们,很高兴我们又见面了。 首先先感谢朋友们的关注。当然我更希望认识与计算机相关的领域的朋友咱们一起探讨交流。重点说一下,我是真人,不是那些扒文章的自媒体组织,大家可以相互交流的!     本篇文章我们来讲一下关于AI相关的人脸追踪,人脸识别相关的一些知识。
3660 0
|
机器学习/深度学习 算法框架/工具 计算机视觉
|
2天前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
6 0
|
26天前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
23 1
|
26天前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
20 1
|
1月前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
35 1
|
1月前
|
计算机视觉
OpenCV图像二值化
OpenCV图像二值化