前言

参考文章:
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 = oix, iy, iw, ih = ireturn 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 = personcv2.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):breakelse: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 = foundRectcv2.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))

python opencv 人体/人脸识别 简易demo相关推荐

  1. python+opencv实现人脸识别|采用现成训练好的模型

    一.图片人脸检测(opencv) 1.安装opencv环境 介绍windows中opencv在python3上的实现,我的系统环境win10+python3.6+opcv3.4.1 首先去网站下载Op ...

  2. 树莓派用Python+OpenCV做人脸识别

    硬件:树莓派 B+ 先安装python-opencv: sudo apt-get install python-opencv Python 2.7   OpenCV3.0 然后在树莓派usb端口插入一 ...

  3. python+opencv的人脸识别+语音播报集成的模拟人脸打卡系统的编程思路

      1.前言   人脸打卡系统实现的功能是:刷张三的脸并提示打卡成功,想满足这个条件首先要有张三的图像制成的分类器,外加上一个判断语句做成的语音播报,语音播报有相关的第三方库,所以让他发出声音只需要刷 ...

  4. python读取视频流做人脸识别_基于 Python + OpenCV 进行人脸识别,视频追踪代码全注释...

    1 #-*- coding: utf-8 -*- 2 from __future__ importunicode_literals3 #操作文件 4 importos5 #科学计算 6 importn ...

  5. 基于Python+OpenCV的人脸识别实现带墨镜效果

    环境以及执行步骤 相关介绍 环境配置 相关库安装介绍 上代码 github地址 动图介绍 改进 相关介绍 你好! 项目起初来源于一本科生的毕业设计,由于我给了一版更加优秀,所以初始版本的例子给予分享. ...

  6. python opencv 视频人脸识别

    It is not right ofthe sun to shine.Everyone can. 发光不是太阳的权利 每个人都可以 关于opencv我就不再多说了上链接 opencv中文http:// ...

  7. OpenCV图像人脸识别人数统计

    Python+OpenCV图像人脸识别人数统计 如需远程调试,可加QQ905733049由专业技术人员远程协助! 运行代码如下: #!/usr/bin/python # -*- coding: utf ...

  8. Python OpenCV车道线识别侦测

    Python OpenCV车道线识别侦测 如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import cv2 ...

  9. python opencv生成tf模型_基于TensorFlow+ Opencv 的人脸识别 和模型训练

    一.准备工作 本次实例的anaconda 环境 (有需要的自己导入anaconda) 链接:https://pan.baidu.com/s/1IVt2ap-NYdg64uHSh-viaA 提取码:g7 ...

最新文章

  1. java未将对象引用设置_未将对象引用到实例怎么解决_常见问题解析,java
  2. 盘点欧盟反垄断案对整个安卓生态造成的5大影响
  3. 【Java线程安全】 synchronized同步方法、同步块:模拟抢票、模拟取款
  4. 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)
  5. Maven学习总结(41)——Maven依赖范围、传递、排除详解
  6. Unity3D之UGUI基础1:UGUI插件介绍
  7. 浅谈Visual Studio 2010并行运算原理
  8. 简略谈谈AS安装的一些小问题
  9. MacOS 开发 - isFlipped(坐标系)
  10. c语言 结束360进程,python修改注册表终止360进程实例
  11. 黑马JAVA P104 继承后构造器的特点、this、super使用总结
  12. 模型理论5_英语学术论文摘要语步结构自动识别模型的构建
  13. Python Seaborn (1) 艺术化的图表控制
  14. 在Carla中加入可以使用的自己的车
  15. GPGPU-Sim(番外)-如何加快GPGPU-Sim的运行速度
  16. IP地址、端口Port
  17. 西门子变频器SINAMICS G120系列控制单元的STO功能设置方法
  18. 购物篮分析(Apriori算法):Mlxtend实现
  19. 概率论期末复习大纲,知识点网课平替
  20. SCP-064R-V-I43-W35-Z1M-300到货实拍图片

热门文章

  1. Django如何发送电子邮件?
  2. uTools插件-Excalidraw轻量的在线白板绘图工具
  3. django - form
  4. MindSpore论坛十二月有奖活动
  5. 期权量化策略:如何利用期权捕捉期现套利机会?
  6. python中gbk是什么意思_用gbk比utf-8的好处是什么?
  7. 51个Python鲜为人知的秘密特性,老司机看完都惊叹不已
  8. android 打赏功能,微信公号赞赏功能恢复:可直接收打赏 iOS安卓均可用
  9. 卡尔曼滤波算法的代码验证
  10. 基于OpenWRT+FreeRadius+TinyRadius+Daloradius实现portal加radius安全认证