opencv人脸识别算法(python利用Opencv实现人脸识别功能)
类别:脚本大全 浏览量:1801
时间:2021-10-12 00:55:27 opencv人脸识别算法
python利用Opencv实现人脸识别功能本文实例为大家分享了python利用opencv实现人脸识别功能的具体代码,供大家参考,具体内容如下
首先:需要在在自己本地安装opencv具体步骤可以问度娘
如果从事于开发中的话建议用第三方的人脸识别(推荐阿里)
1、视频流中进行人脸识别
|
# -*- coding: utf-8 -*- import cv2 import sys from pil import image def catchusbvideo(window_name, camera_idx): cv2.namedwindow(window_name) # 视频来源,可以来自一段已存好的视频,也可以直接来自usb摄像头 cap = cv2.videocapture(camera_idx) # 告诉opencv使用人脸识别分类器 classfier = cv2.cascadeclassifier( "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml" ) # 识别出人脸后要画的边框的颜色,rgb格式 color = ( 0 , 255 , 0 ) count = 0 while cap.isopened(): ok, frame = cap.read() # 读取一帧数据 if not ok: break # 将当前帧转换成灰度图像 grey = cv2.cvtcolor(frame, cv2.color_bgr2gray) # 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数 facerects = classfier.detectmultiscale(grey, scalefactor = 1.2 , minneighbors = 3 , minsize = ( 32 , 32 )) if len (facerects) > 0 : # 大于0则检测到人脸 count = count + 1 return count if __name__ = = '__main__' : result = catchusbvideo( "识别人脸区域" , '2222.mp4' ) if result> 0 : print ( '视频中有人!!' ) else : print ( '视频中无人!!' ) |
2、通过图片识别人脸
|
#-*-coding:utf8-*-# import os import cv2 from pil import image,imagedraw from datetime import datetime import time #detectfaces()返回图像中所有人脸的矩形坐标(矩形左上、右下顶点) #使用haar特征的级联分类器haarcascade_frontalface_default.xml,在haarcascades目录下还有其他的训练好的xml文件可供选择。 #注:haarcascades目录下训练好的分类器必须以灰度图作为输入。 def detectfaces(image_name): img = cv2.imread(image_name) face_cascade = cv2.cascadeclassifier( "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml" ) if img.ndim = = 3 : gray = cv2.cvtcolor(img, cv2.color_bgr2gray) else : gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图 faces = face_cascade.detectmultiscale(gray, 1.2 , 5 ) #1.3和5是特征的最小、最大检测窗口,它改变检测结果也会改变 result = [] for (x,y,width,height) in faces: result.append((x,y,x + width,y + height)) return result #保存人脸图 def savefaces(image_name): faces = detectfaces(image_name) if faces: #将人脸保存在save_dir目录下。 #image模块:image.open获取图像句柄,crop剪切图像(剪切的区域就是detectfaces返回的坐标),save保存。 save_dir = image_name.split( '.' )[ 0 ] + "_faces" os.mkdir(save_dir) count = 0 for (x1,y1,x2,y2) in faces: file_name = os.path.join(save_dir, str (count) + ".jpg" ) image. open (image_name).crop((x1,y1,x2,y2)).save(file_name) count + = 1 #在原图像上画矩形,框出所有人脸。 #调用image模块的draw方法,image.open获取图像句柄,imagedraw.draw获取该图像的draw实例,然后调用该draw实例的rectangle方法画矩形(矩形的坐标即 #detectfaces返回的坐标),outline是矩形线条颜色(b,g,r)。 #注:原始图像如果是灰度图,则去掉outline,因为灰度图没有rgb可言。draweyes、detectsmiles也一样。 def drawfaces(image_name): faces = detectfaces(image_name) if faces: img = image. open (image_name) draw_instance = imagedraw.draw(img) for (x1,y1,x2,y2) in faces: draw_instance.rectangle((x1,y1,x2,y2), outline = ( 255 , 0 , 0 )) img.save( 'drawfaces_' + image_name) #检测眼睛,返回坐标 #由于眼睛在人脸上,我们往往是先检测出人脸,再细入地检测眼睛。故detecteyes可在detectfaces基础上来进行,代码中需要注意“相对坐标”。 #当然也可以在整张图片上直接使用分类器,这种方法代码跟detectfaces一样,这里不多说。 def detecteyes(image_name): eye_cascade = cv2.cascadeclassifier( '/usr/share/opencv/haarcascades/haarcascade_eye.xml' ) faces = detectfaces(image_name) img = cv2.imread(image_name) gray = cv2.cvtcolor(img, cv2.color_bgr2gray) result = [] for (x1,y1,x2,y2) in faces: roi_gray = gray[y1:y2, x1:x2] eyes = eye_cascade.detectmultiscale(roi_gray, 1.3 , 2 ) for (ex,ey,ew,eh) in eyes: result.append((x1 + ex,y1 + ey,x1 + ex + ew,y1 + ey + eh)) return result #在原图像上框出眼睛. def draweyes(image_name): eyes = detecteyes(image_name) if eyes: img = image. open (image_name) draw_instance = imagedraw.draw(img) for (x1,y1,x2,y2) in eyes: draw_instance.rectangle((x1,y1,x2,y2), outline = ( 0 , 0 , 255 )) img.save( 'draweyes_' + image_name) #检测笑脸 def detectsmiles(image_name): img = cv2.imread(image_name) smiles_cascade = cv2.cascadeclassifier( "/usr/share/opencv/haarcascades/haarcascade_smile.xml" ) if img.ndim = = 3 : gray = cv2.cvtcolor(img, cv2.color_bgr2gray) else : gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图 smiles = smiles_cascade.detectmultiscale(gray, 4 , 5 ) result = [] for (x,y,width,height) in smiles: result.append((x,y,x + width,y + height)) return result #在原图像上框出笑脸 def drawsmiles(image_name): smiles = detectsmiles(image_name) if smiles: img = image. open (image_name) draw_instance = imagedraw.draw(img) for (x1,y1,x2,y2) in smiles: draw_instance.rectangle((x1,y1,x2,y2), outline = ( 100 , 100 , 0 )) img.save( 'drawsmiles_' + image_name) if __name__ = = '__main__' : time1 = datetime.now() result = detectfaces( '9.jpg' ) time2 = datetime.now() print ( "耗时:" + str (time2 - time1)) if len (result)> 0 : print ( "有人存在!!---》人数为:" + str ( len (result))) else : print ( '视频图像中无人!!' ) drawfaces( '9.jpg' ) # draweyes('obama.jpg') # drawsmiles('obama.jpg') # savefaces('obama.jpg') """ 上面的代码将眼睛、人脸、笑脸在不同的图像上框出,如果需要在同一张图像上框出,改一下代码就可以了。 总之,利用opencv里训练好的haar特征的xml文件,在图片上检测出人脸的坐标,利用这个坐标,我们可以将人脸区域剪切保存,也可以在原图上将人脸框出。剪切保存人脸以及用矩形工具框出人脸,本程序使用的是pil里的image、imagedraw模块。 此外,opencv里面也有画矩形的模块,同样可以用来框出人脸。 """ |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/wsywb111/article/details/79152425
您可能感兴趣
- python time模块是什么(python中时间模块的基本使用教程)
- python读取数据集的图片(浅析Python 读取图像文件的性能对比)
- python栈和队列(Python 实现数据结构中的栈队列)
- pythonpandas操作拆分excel(Python使用pandas和xlsxwriter读写xlsx文件的方法示例)
- python函数使用方法高级用法(Python骚操作之动态定义函数)
- python的基础数据结构有哪些(详解python的四种内置数据结构)
- python3爬虫实例代码(python3通过selenium爬虫获取到dj商品的实例代码)
- python绘折线图数据(python2.7使用plotly绘制本地散点图和折线图)
- python装饰器使用说明(详解Python装饰器)
- mongodb python教程(python使用pymongo操作mongo的完整步骤)
- python面向对象的介绍(Python面向对象思想与应用入门教程类与对象)
- pythonselenium自动化教程(python使用selenium实现批量文件下载)
- ubuntu python3.7安装(详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本)
- python如何解压加密zip文件(python读取有密码的zip压缩文件实例)
- python opencv图像合并(Python3+OpenCV2实现图像的几何变换平移、镜像、缩放、旋转、仿射)
- python实现七个基本算法(python实现维吉尼亚算法)
- 苹果自研芯片跑分对比 A16芯片排名靠后,M1系列霸榜(苹果自研芯片跑分对比)
- X86处理器的梦魇 苹果M1自研芯片到底有多强(苹果M1自研芯片到底有多强)
- 泰剧《爱欲之神》Boom kitkong和Great合体杂志(泰剧爱欲之神Boomkitkong和Great合体杂志)
- 素人恋爱综艺火药味十足 男生为赢得芳心集体扯头花,真是出好戏(素人恋爱综艺火药味十足)
- 《囧妈》为何受抵制 春节七部影片撤档背后的责任与博弈(囧妈为何受抵制)
- 提醒 2019年起河南驾考要开设科目五 官方回应来了(2019年起河南驾考要开设科目五)
热门推荐
- php安全攻防(phpstudy linux小皮面板怎么防cc攻击)
- 腾讯云轻量服务器怎么降低延迟(腾讯云星星海SA2云服务器配置规格性能实际评测)
- tick数据间隔时间为2秒(让你一看就明白的$nextTick讲解)
- 服务器虚拟化需要哪些技术(认识云服务器的虚拟化实现途径)
- spark sql常用操作(Spark SQL数据加载和保存实例讲解)
- mysql删除数据库的命令(MySQL 线上数据库清理数据的方法)
- laravel 模块目录(Laravel框架文件上传功能实现方法示例)
- border和background区别(css中background-origin属性的使用解析)
- dedecms当天文章总数(dedecms5.7文章二次开发实现阅读全文功能的方法)
- 最新版dedecms安全策略(DedeCMS站点高级安全策略Linux篇)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9