开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 2.5K

码龙/从零学Python

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (2)
master
备份
master
分支 (2)
master
备份
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (2)
master
备份
Python
/
Day09
/
face.py
Python
/
Day09
/
face.py
face.py 5.87 KB
一键复制 编辑 原始数据 按行查看 历史
小柒2012商城 提交于 2019年03月03日 14:23 +08:00 . 多人合影识别
# -*-coding:utf8-*-#
import os
import cv2
from PIL import Image, ImageDraw
from datetime import datetime
"""
detectFaces()返回图像中所有人脸的矩形坐标(矩形左上、右下顶点)
使用haar特征的级联分类器haarcascade_frontalface_default.xml,在haarcascades目录下还有其他的训练好的xml文件可供选择。
注:haarcascades目录下训练好的分类器必须以灰度图作为输入。
分类器 https://github.com/opencv/opencv/tree/master/data/haarcascades
安装模块:pip install Pillow pip install opencv-python
"""
def detectFaces(image_name):
img = cv2.imread(image_name)
face_cascade = cv2.CascadeClassifier(os.getcwd()+"\\haarcascade\\haarcascade_frontalface_alt.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(path, image_name):
faces = detectFaces(path+image_name)
if faces:
img = Image.open(path+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(path+'drawfaces_' + image_name)
# 检测眼睛,返回坐标
# 由于眼睛在人脸上,我们往往是先检测出人脸,再细入地检测眼睛。故detectEyes可在detectFaces基础上来进行,代码中需要注意"相对坐标"。
# 当然也可以在整张图片上直接使用分类器,这种方法代码跟detectFaces一样,这里不多说。
def detectEyes(image_name):
eye_cascade = cv2.CascadeClassifier(os.getcwd()+"\\haarcascade\\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(os.getcwd()+"\\haarcascade\\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(os.getcwd()+"\\images\\heying.jpg")
time2 = datetime.now()
print("耗时:" + str(time2 - time1))
if len(result) > 0:
print("有人存在!!---》人数为:" + str(len(result)))
else:
print('视频图像中无人!!')
drawFaces(os.getcwd()+"\\images\\", "heying.jpg")
# saveFaces(os.getcwd()+"\\images\\heying.jpg")
# drawSmiles('img/people.jpg') # 极其不准确
# drawEyes('people.jpg') # 有问题报错
"""
上面的代码将眼睛、人脸、笑脸在不同的图像上框出,如果需要在同一张图像上框出,改一下代码就可以了。
总之,利用opencv里训练好的haar特征的xml文件,在图片上检测出人脸的坐标,利用这个坐标,我们可以将人脸区域剪切保存,也可以在原图上将人脸框出。剪切保存人脸以及用矩形工具框出人脸,本程序使用的是PIL里的Image、ImageDraw模块。
此外,opencv里面也有画矩形的模块,同样可以用来框出人脸。
"""
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

从零学Python,各种开发案例,不定期更新。
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/code_2020/Python.git
git@gitee.com:code_2020/Python.git
code_2020
Python
从零学Python
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /