pythonopencv人体/人脸识别简易demo(代码片段)

Love丶伊卡洛斯 Love丶伊卡洛斯     2022-12-10     290

关键词:

前言

参考文章:
pythonopencv检测行人_【图像处理】使用OpenCV实现人脸和行人检测
Python如何实现行人识别-人体识别

本文主要讲述关于opencv官方提供的现成模型,采取Hog特征和SVM分类器的方式,实现对图片、视频进行人体/人脸的识别,并用不同颜色框出识别的矩形区域。
ps:测试图片源于网络,如有侵权,可私聊立删。

开发环境:pycharm-2020.1.5, python-3.8.5,opencv-python-4.5.4.58,opencv-4.2.0-vc14_vc15
cascade的xml数据路径:opencv\\sources\\data\\haarcascades
相关数据用途可参考:使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测

效果图



视频素材来自:https://wedistill.io/categories/people

相关函数解释

参考文档:
https://docs.opencv.org/2.4/modules/core/doc/intro.html#api-concepts
https://docs.opencv.org/4.1.2/d7/dbd/group__imgproc.html

HOG::detectMultiScale

HOGDescriptor::setSVMDetector

CascadeClassifier::CascadeClassifier

CascadeClassifier::detectMultiScale

VideoCapture::isOpened

VideoCapture::read

源码

import cv2
import sys, os

# 判断框中框
def is_inside(o, i):
    ox, oy, ow, oh = o
    ix, iy, iw, ih = i
    return ox > ix and oy > iy and ox + ow < ix + iw and oy + oh < iy + ih


# 框出人 传入图片 矩形参数 BGR
def draw_person(image, person, bgr):
    x, y, w, h = person
    cv2.rectangle(image, (x, y), (x + w, y + h), bgr, 2)


# 筛选识别出的人矩形数据
def screen_found(found):
    for ri, r in enumerate(found):
        for qi, q, in enumerate(found):
            if ri != qi and is_inside(r, q):
                break
            else:
                found_filtered.append(r)


# 等比缩放 参考:https://blog.csdn.net/JulyLi2019/article/details/120720752
def resize_keep_aspectratio(image_src, dst_size):
    src_h, src_w = image_src.shape[:2]
    # print(src_h, src_w)
    dst_h, dst_w = dst_size

    # 判断应该按哪个边做等比缩放
    h = dst_w * (float(src_h) / src_w)  # 按照w做等比缩放
    w = dst_h * (float(src_w) / src_h)  # 按照h做等比缩放

    h = int(h)
    w = int(w)

    if h <= dst_h:
        image_dst = cv2.resize(image_src, (dst_w, int(h)))
    else:
        image_dst = cv2.resize(image_src, (int(w), dst_h))

    h_, w_ = image_dst.shape[:2]
    # print(h_, w_)
    print('等比缩放完毕')

    return image_dst


# cascade图片人体识别和绘制边框 参数 需要识别的图片 输出绘制的图片 xml路径 bgr颜色 目标的最小尺寸 目标的最大尺寸
def cascade_img_person_detect_draw(src_img, dst_img, xml_path, bgr, min_size, max_size):
    detector = cv2.CascadeClassifier(xml_path)
    # image表示的是要检测的输入图像
    # objects表示检测到的人脸目标序列
    # scaleFactor表示每次图像尺寸减小的比例
    # minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)
    # flag 对于旧级联具有与函数cvHaarDetectObjects相同的含义。它不用于新的级联。
    # minSize为目标的最小尺寸
    # maxSize为目标的最大尺寸
    # found = detector.detectMultiScale(src_img)
    found = detector.detectMultiScale(src_img, 1.1, 3, cv2.CASCADE_SCALE_IMAGE, (0, 0), (500, 500))

    # 筛选识别出的人矩形数据
    screen_found(found)

    for person in found_filtered:
        draw_person(dst_img, person, bgr)

    found_filtered.clear()

    print(xml_path + " 识别出:" + str(len(found)) + "个结果。")

# 参考文章:https://blog.csdn.net/www_16302_com/article/details/103817612
# cascade视频人体识别和绘制边框 参数 需要识别的视频路径 xml路径 bgr颜色 目标的最小尺寸 目标的最大尺寸
# 按 Q 键退出函数
def cascade_video_person_detect_draw(video_path, xml_path, bgr, min_size, max_size):
    cap = cv2.VideoCapture(video_path)

    # 告诉OpenCV使用什么识别分类器
    classfier = cv2.CascadeClassifier(xml_path)

    while cap.isOpened():
        # 读取一帧数据
        ret, frame = cap.read()
        # 抓取不到视频帧,则退出循环
        if not ret:
            break
        # 显示方向
        frame = cv2.flip(frame, 1)

        # 将当前帧转换成灰度图像
        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 检测结果
        # 第一个参数是灰度图像
        # 第而个参数scaleFactor表示每次图像尺寸减小的比例
        # 第三个参数是人脸检测次数,设置越高,误检率越低,但是对于迷糊图片,我们设置越高,越不易检测出来
        # minSize为目标的最小尺寸
        # maxSize为目标的最大尺寸
        found = classfier.detectMultiScale(grey, scaleFactor=1.1, minNeighbors=4, minSize=min_size, maxSize=max_size)

        # 框出识别结果
        if len(found) > 0:
            for foundRect in found:
                x, y, w, h = foundRect
                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), bgr, 1)

        # 显示图像
        cv2.imshow('person detection', frame)
        # 键盘Q键结束
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break

    # 释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()

    print("视频识别结束。")


# 读取图片,修改为自己的路径即可
img = cv2.imread("img/people_detection/4.jpg")
# 等比缩放至500*500
img = resize_keep_aspectratio(img, [500, 500])
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 存储所有识别出的坐标集
found_filtered = []

hog = cv2.HOGDescriptor()
# 加载SVM模型 行人识别
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

# 对图像进行多尺度目标检测 返回检测到区域的坐标
found, w = hog.detectMultiScale(gray)
# print(found)

# 筛选识别出的人矩形数据
screen_found(found)

# 在原图上绘出识别出的所有矩形 蓝色
for person in found_filtered:
    draw_person(img, person, (255, 0, 0))

# 清空列表
found_filtered.clear()

print("HOGDescriptor_getDefaultPeopleDetector 识别出:" + str(len(found)) + "个结果。")

# 正脸识别 绿色
cascade_img_person_detect_draw(gray, img, "data/haarcascade_frontalface_default.xml", (0, 255, 0), (0, 0), (500, 500))

# 侧脸识别 红色
cascade_img_person_detect_draw(gray, img, "data/haarcascade_profileface.xml", (0, 0, 255), (0, 0), (500, 500))

# 全身识别 青色
cascade_img_person_detect_draw(gray, img, "data/haarcascade_fullbody.xml", (255, 255, 0), (0, 0), (500, 500))

# 上半身识别 洋红
cascade_img_person_detect_draw(gray, img, "data/haarcascade_upperbody.xml", (255, 0, 255), (0, 0), (500, 500))

# 下半身识别 黄色
cascade_img_person_detect_draw(gray, img, "data/haarcascade_lowerbody.xml", (0, 255, 255), (0, 0), (500, 500))


cv2.imshow("people detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 视频素材来自:https://wedistill.io/categories/people
# 参数 需要识别的视频路径 xml路径 bgr颜色 目标的最小尺寸 目标的最大尺寸
cascade_video_person_detect_draw("video/1.mp4", "data/haarcascade_upperbody.xml", (0, 255, 0), (50, 50), (1000, 3000))


pythonopencv人体/人脸识别简易demo(代码片段)

前言参考文章:pythonopencv检测行人_【图像处理】使用OpenCV实现人脸和行人检测Python如何实现行人识别-人体识别本文主要讲述关于opencv官方提供的现成模型,采取Hog特征和SVM分类器的方式,实现对图片、视频进行人体/... 查看详情

pythonopencv开发mr智能人脸识别打卡系统(四服务模块设计)(代码片段)

...码请点赞关注收藏后评论区留言私信~~~整体系统讲解如下PythonOpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)PythonOpenCV开发MR智能人脸识别打卡系统(二、文件系统、数据实体模块设计)PythonOpenCV开发MR智能人... 查看详情

pythonopencv开发mr智能人脸识别打卡系统(三工具模块设计)(代码片段)

...请点赞关注收藏后评论区留言私信~~~整体系统讲解如下 PythonOpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)PythonOpenCV开发MR智能人脸识别打卡系统(二、文件系统、数据实体模块设计)PythonOpenCV开发MR智能人... 查看详情

pythonopencv开发mr智能人脸识别打卡系统(五程序入口设计与测试)(代码片段)

...码请点赞关注收藏后评论区留言私信~~~整体系统讲解如下PythonOpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)PythonOpenCV开发MR智能人脸识别打卡系统(二、文件系统、数据实体模块设计)PythonOpenCV开发MR智能人... 查看详情

人脸识别实战:使用pythonopencv和深度学习进行人脸识别(代码片段)

在本教程中,您将学习如何使用OpenCV、Python和深度学习执行面部识别。我们将首先简要讨论基于深度学习的面部识别的工作原理,包括“深度度量学习”的概念。从那里,我将帮助您安装实际执行人脸识别所需的库。... 查看详情

ai人体检测/人脸识别智能分析网关v2的配置步骤及操作使用

...可通过对监控视频进行智能识别与分析,提供人脸、人体、车辆、烟火、物体、行为等识别、抓拍、比对、告警等服务,对场景中的异常及违规现象进行精准研判、辅助决策等,满足用户基于视频服务的数据感知、智... 查看详情

c#离线人脸识别arcsoftv2.0demo

本来打算做个C#版demo,但没用成功。使用虹软最新人脸识别技术开发完成过程如下:1、传入一张单人脸照片;2、调用检测人脸函数ASFDetectFaces,成功返回人脸信息的指针;3、使用Marshal.ReadByte(intPtr,offset)函数读出字节数,发现前... 查看详情

c#实现基于ffmpeg加虹软arcface的人脸识别demo(代码片段)

对开发库的C#封装,屏蔽使用细节,可以快速安全的调用人脸识别相关API。具体见github地址。新增对.NETCore的支持,在Linux(Ubuntu下)测试通过。具体的使用例子和Demo详解,参见博客地址。更新:增加对V1.1两个新功能的支持。关... 查看详情

基于dlib进行人脸识别demo(代码片段)

...xff0c;cv2,numpy,dlib项目所要达到的目的:实现人脸识别(输入几张图片,人脸检测、关键点检测、人脸关键点进行编码存储起来,再传进来一张图片,判断新传来来这张图片属于哪一个人)如果dlib... 查看详情

基于dlib进行人脸识别demo(代码片段)

...xff0c;cv2,numpy,dlib项目所要达到的目的:实现人脸识别(输入几张图片,人脸检测、关键点检测、人脸关键点进行编码存储起来,再传进来一张图片,判断新传来来这张图片属于哪一个人)如果dlib... 查看详情

face_recognition库实现人脸识别demo(代码片段)

...片,提取特征向量然后存储起来,让后拿第三章人脸图片来检测,查看是否匹配,匹配则输出名字和图像。 主要方法:demo:#1、加载库importface_recognitionimportcv2importnumpyasnp#2、加载图片fei=cv2.imrea 查看详情

face_recognition库实现人脸识别demo(代码片段)

...片,提取特征向量然后存储起来,让后拿第三章人脸图片来检测,查看是否匹配,匹配则输出名字和图像。 主要方法:demo:#1、加载库importface_recognitionimportcv2importnumpyasnp#2、加载图片fei=cv2.imrea 查看详情

opencv人脸识别--detectmultiscale函数

...nbsp; Haar特征分类器就是一个XML文件,该文件中会描述人体各 查看详情

人脸识别/安全帽识别ai智能分析网关微信端告警推送如何配置模板消息?

...网关设备内置多种AI算法,可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍,支持口罩佩戴检测、安全帽佩戴检测、人体检测、区域入侵检测等,可支持拓展多种AI检测算法。其中,升级版还可支持人... 查看详情

虹软人脸识别——官方qtdemo移植到linux(代码片段)

一、前言最近需要在Linux平台下开发一个人脸识别相关的应用,用到了虹软的人脸识别SDK。之前在Windows平台用过,感觉不错,SDK里面还带了Demo可以快速看到效果。打开Linux版本的SDK里面没有发现Demo,于是想着把Windows的Demo移植到... 查看详情

java离线人脸识别基于arcface2.0demo

源代码传送:https://github.com/itboyst/ArcSoftFaceDemo开发环境准备:###开发使用到的软件和工具:Jdk8、mysql5.7、libarcsoft_face.dll(so)、libarcsoft_face_engine.dll(so)、libarcsoft_face_engine_jni.dll(so)、idea注:libarcsoft_face.dll( 查看详情

qt功能优化:qt人脸识别(代码片段)

Qt功能优化:Qt人脸识别@TOC一、效果图如图1所示,为我用Qt所做的一个简易的人脸识别代码,点击识别即可自动识别出照片中的人脸。二、使用步骤项目架构:1..pro部分#-------------------------------------------------##ProjectcreatedbyQtCreator20... 查看详情

有没有支持多人人脸识别的算法,要识别的人脸比较多

人脸识别SDK是否支持/如何实现多人脸识别?/在打开活体开关的情况下如何实现多人同时识别?虹软Android2.2版本demo——在faceHelper里去掉keepMaxFace那句代码(demo画框设置了只画最大人脸框),并关闭活体,通过faceID的判断可以实... 查看详情