**最新文章会在我的个人网站发布:http://www.xiaokai1999.cn/
**
这个项目在寒假前就做了,因为当时在学校,不管是来窜宿舍的同学或者是自己宿舍里的同学,总会有人对我的电脑产生兴趣,然后偷看我的电脑。于是我就想了个办法,记录那些偷看过我电脑的人。
嘿嘿,接下来就是男生之间的交易了。
大概想法:
实现效果:
语音视频文件展示–>因为视频太短,上传到bilibili并不好,可以移步我的个人博客查看
文章目录
涉及到的知识点:
1.十行Python代码实现人脸识别
2.调用百度api实现语音合成
3.如何操作email库
1.十行Python代码实现人脸识别
-
使用基于Haar特征的Cascade级联分类器进行人脸识别(听起来好高大上,但其实原理很简单)
-
用人脸识别同样的道理,扩展到人眼识别上
-
用opencv自带的Harr级联分类器进行人脸、人眼与微笑识别
啥是Harr特征
Haar特征包含三种:边缘特征、线性特征、中心特征和对角线特征。每种分类器都从图片中提取出对应的特征。
Harr特征
搜索人脸上的指定特征
比如上图中,横的黑道将人脸中较暗的双眼提取了出来,而竖的白道将人脸中较亮的鼻梁提取了出来。
啥是Cascade级联分类器
基于Haar特征的cascade级联分类器是Paul Viola和 Michael Jone在2001年的论文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一种有效的物体检测方法。
Cascade级联分类器的训练方法:Adaboost
级联分类器的函数是通过大量带人脸
和不带人脸
的图片通过机器学习得到的。对于人脸识别来说,需要几万个特征,通过机器学习找出人脸分类效果最好、错误率最小的特征。训练开始时,所有训练集中的图片具有相同的权重,对于被分类错误的图片,提升权重,重新计算出新的错误率和新的权重。直到错误率或迭代次数达到要求。这种方法叫做Adaboost
。
在Opencv中可以直接调用级联分类器函数。
将弱分类器聚合成强分类器
最终的分类器是这些弱分类器的加权和。之所以称之为弱分类器是因为每个分类器不能单独分类图片,但是将他们聚集起来就形成了强分类器。论文表明,只需要200个特征的分类器在检测中的精确度达到了95%。最终的分类器大约有6000个特征。(将超过160000个特征减小到6000个,这是非常大的进步了) 。
级联的含义:需过五关斩六将才能被提取出来
事实上,一张图片绝大部分的区域都不是人脸。如果对一张图片的每个角落都提取6000个特征,将会浪费巨量的计算资源。
如果能找到一个简单的方法能够检测某个窗口是不是人脸区域,如果该窗口不是人脸区域,那么就只看一眼便直接跳过,也就不用进行后续处理了,这样就能集中精力判别那些可能是人脸的区域。
为此,有人引入了Cascade 分类器。它不是将6000个特征都用在一个窗口,而是将特征分为不同的阶段,然后一个阶段一个阶段的应用这些特征(通常情况下,前几个阶段只有很少量的特征)。如果窗口在第一个阶段就检测失败了,那么就直接舍弃它,无需考虑剩下的特征。如果检测通过,则考虑第二阶段的特征并继续处理。如果所有阶段的都通过了,那么这个窗口就是人脸区域。
作者的检测器将6000+的特征分为了38个阶段,前五个阶段分别有1,10,25,25,50个特征(前文图中提到的识别眼睛和鼻梁的两个特征实际上是Adaboost中得到的最好的两个特征)。根据作者所述,平均每个子窗口只需要使用6000+个特征中的10个左右。
OpenCV中的Haar-cascade检测
OpenCV 既可以作为检测器也可以进行机器学习训练。如果你打算训练自己的分类器识别任意的物品,比如车,飞机,咖啡杯等。你可以用OpenCV 创造一个。完整的细节在:Cascade Classifier Training¶中。
下面给出调用OpenCV进行基于Haar特征的人脸和人眼Cascade级联分类器的源代码。
十行代码完成人脸识别(代码)
# 导入opencv-python
import cv2
# 读入一张图片,引号里为图片的路径,需要你自己手动设置
img = cv2.imread('image1.jpg',1)
# 导入人脸级联分类器引擎,'.xml'文件里包含训练出来的人脸特征
face_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
# 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表,1.3是放大比例,5是重复识别次数
faces = face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)
# 对每一张脸,进行如下操作
for (x,y,w,h) in faces:
# 画出人脸框,蓝色(BGR色彩体系),画笔宽度为2
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 在"img2"窗口中展示效果图
cv2.imshow('img2',img)
# 监听键盘上任何按键,如有按键即退出并关闭窗口,并将图片保存为output.jpg
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('output.jpg',img)
上文引用自:https://www.jianshu.com/p/ea3c57b6c5e1
2.调用百度api实现语音合成
有些人可能会问,为什么不自己写一个,而去用百度api呢?
我的回答:免费的干嘛不用,非要去自己造轮子,
- 目前百度api的语音合成是免费的,每天也没有限制,想怎么用怎么用。
2.1添加自己的机器人
没有百度帐号的可以先创建一个帐号(话说现在还有谁没有无良商家的帐号呢,狗头保命)
我可是
,可是下载速度依旧只有100k/s,100M的网速被疯狂压榨
好,回归正题。
2.1.1 创建
2.1.2填写
2.1.3 得到APPID,AK,SK
2.1.4 下载官方api
支持Python版本:2.7.+ ,3.+
安装使用Python SDK有如下方式:
如果已安装pip,执行pip install baidu-aip即可。
如果已安装setuptools,执行python setup.py install即可。
2.2 代码实现语音识别
'''baidu.py'''
from aip import AipSpeech
import os
import playsound
""" 你的 APPID AK SK """
"""填入上面获取到的3个字符串"""
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 语音播报 我这边用到了 vlc播放器,大家也可以尝试别的方法
def play_audio():
path = os.getcwd()
commend = "cvlc " + path +"/myGetAudio.wav vlc://quit"
os.system(commend)
# playsound("ffmpeg myGetAudio.wav")
print("语音播放完成")
# 合成音频
def hecheng_audio(msg):
result = client.synthesis(msg, 'zh', 1, {
'vol': 5,
'per': 3
})
print("完成")
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open('myGetAudio.wav', 'wb') as f:
f.write(result)
f.close()
print("语音接受完成")
play_audio()
3.email库的操作方法(主要可以去https://docs.python.org/zh-cn/3/library/email.html查看详细资料)以下给出具体的操作方法
'''
@author:JackyMao
'''
#------------------------------------------------------------------------------------------------
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import os,time,re
def send_Test_email(mail_to):
'''本模块实现获取最新的测试报告html文件,读取部分报告内容作为邮件正文,将报告作为附件,并发送到指定的邮箱,
参数mail_to代表的是接收邮箱,例如:'xxx@163.com' '''
#发送邮箱
mail_from = 'yyy@163.com'
#发送邮件主题
mail_subject = 'Automation Test Report'
#发送邮箱服务器
mail_smtpserver = 'smtp.163.com'
#发送邮箱用户/密码
mail_username = 'yyy@163.com'
mail_password = 'yyyyyy'
#定义邮件内容,中文需参数‘utf-8’,单字节字符不需要
'''
#发送文件形式的邮件
msg = MIMEText('你好!','text','utf-8')
'''
'''
#发送html形式以正常文本显示在邮件内容中的邮件
msg = MIMEText('<html><h1>你好!</h1></html>','html','utf-8')
'''
'''
#读取html文件内容并发送
f=open(file_new,'rb')
mail_body=f.read()
f.close()
print mail_body
msg=MIMEText(mail_body,_subtype='html',_charset='utf-8')
'''
#创建一个带附件的邮件实例(内容)
msg = MIMEMultipart()
#找到report目录下最新生成的报告文件供后续使用
result_dir = 'D:\\report'
lists=os.listdir(result_dir)
lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\\"+fn) if not
os.path.isdir(result_dir+"\\"+fn) else 0)
print (u'The Latest Test Report is: '+lists[-1])
file_new = os.path.join(result_dir,lists[-1])
#读取最新的测试报告文件获取部分信息来定义邮件的内容
Regex_Theme=re.compile(r'Automation Test Report')
Regex_Content=re.compile(r'<strong>(.*:)</strong>(.*)<')
Report_File=open(file_new,'r')
Mail_Content=[]
for line in Report_File.readlines():
if '<title>Automation Test Report</title>' in line or "<p class='attribute'>" in line:
i=Regex_Theme.findall(line)
j=Regex_Content.findall(line)
if i != []:
Mail_Content.append(i)
if j != []:
Mail_Content.append(j)
Report_File.close()
#将读取到的测试报告的数据以html形式显示为邮件的中文
msgTest=MIMEText('''<html><h1>Test completed,Test results are as follows:</h1></html>'''
'''<hr />'''
'''<p><strong>'''+Mail_Content[0][0]+'''</strong></p>'''
'''<p><strong>'''+Mail_Content[1][0][0]+'''</strong>'''+Mail_Content[1][0][1]+'''</p>'''
'''<p><strong>'''+Mail_Content[2][0][0]+'''</strong>'''+Mail_Content[2][0][1]+'''</p>'''
'''<p><strong>'''+Mail_Content[3][0][0]+'''</strong>'''+Mail_Content[3][0][1]+'''</p>'''
'''<hr />'''
'''<p>PS: Detailed test results please refer to the attachment</p>'''
,'html','utf-8')
msg.attach(msgTest)
#定义邮件的附件
att1 = MIMEText(open(file_new, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] ='attachment; filename="Automation test report.html"'#这里的filename指的是附件的名称及类型
msg.attach(att1)
#将邮件的主题等相关信息添加到邮件实例
msg['Subject'] = Header(mail_subject)
msg['From'] = mail_from
msg['To'] = mail_to
msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')
#创建发送服务器实例并将发送服务器添加到实例中
smtp = smtplib.SMTP()
smtp.connect(mail_smtpserver)
'''
#采用ssl加密传输
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
'''
'''
#打印交互的日志信息
#smtp.set_debuglevel(1)
'''
#登录发送邮件服务器并进行邮件的发送
smtp.login(mail_username, mail_password)
smtp.sendmail(mail_from, mail_to, msg.as_string())
print u'Test report sent successfully,Please go to the following email to check the test report :%s' %mail_to
smtp.quit()
#----------------------------------------------------------------------------------------------------
if __name__ == "__main__":
send_Test_email('xxx@126.com')
当然,如果要使用email模块的其他功能,可以参考网上的以下7个列子:
一,文件形式的邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
msg = MIMEText('你好','text','utf-8')#中文需参数‘utf-8',单字节字符不需要
msg['Subject'] = Header(subject, 'utf-8')
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
二、html形式的邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
msg = MIMEText('</pre>
<h1>你好</h1>
<pre>','html','utf-8')
msg['Subject'] = subject
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
三、带图片的html邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'test message'
msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.
<img alt="" src="cid:image1" />
good!','html','utf-8')
msgRoot.attach(msgText)
fp = open('h:\\python\\1.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '')
msgRoot.attach(msgImage)
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()
四、带附件的邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'test message'
#构造附件
att = MIMEText(open('h:\\python\\1.jpg', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="1.jpg"'
msgRoot.attach(att)
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()
五、群邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
sender = '***'
receiver = ['***','****',……]
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
msg = MIMEText('你好','text','utf-8')
msg['Subject'] = subject
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
六、包含各种元素的邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
# Create the body of the message (a plain-text and an HTML version).
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
Hi!
How are you?
Here is the <a href="http://www.python.org">link</a> you wanted.
"""
# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)
#构造附件
att = MIMEText(open('h:\\python\\1.jpg', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="1.jpg"'
msg.attach(att)
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
7、基于ssl的邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
msg = MIMEText('你好','text','utf-8')#中文需参数‘utf-8',单字节字符不需要
msg['Subject'] = Header(subject, 'utf-8')
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.set_debuglevel(1)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
接下来就是源代码时刻(复制粘帖就能用的那种哦)
Email_Received.py
'''Email_Received.py'''
# pop3
import poplib
# 邮箱标题文本
from email.header import decode_header
# 邮箱分析器
from email.parser import Parser
# 用来解析邮件来源
from email.utils import parseaddr
# 邮件接收类
class Email_Received:
def __init__(self,usercount,password,pop3_url):
self.usercount = usercount # 用户的账户
self.password = password # 用户的密码
self.pop3_sever = poplib.POP3(pop3_url)# pop3服务器为163
def conect_pop(self):
self.pop3_sever.user(self.usercount)# 验证账号
self.pop3_sever.pass_(self.password)# 验证密码
def get_length(self):
rsp, msg_list, rsp_siz = self.pop3_sever.list()# 获取当前邮箱邮件数,为字节型
return len(msg_list)
def get_latest_email(self):
self.pop3_sever.set_debuglevel(1)# set_debuglevel()参数为1,后面的函数会输出信息
#print(self.pop3_sever.getwelcome().decode('utf8'))# 获取邮箱欢迎语句
rsp, msg_list, rsp_siz = self.pop3_sever.list()# 获取当前邮件数
self.nowcount = len(msg_list)
rsp, msglines, msgsiz = self.pop3_sever.retr(len(msg_list))# 获取邮件信息
#print(msglines)
msg_content = b'\r\n'.join(msglines).decode('gbk')
#print(msg_content)
msg = Parser().parsestr(text=msg_content)#分析邮件信息
self.msg = msg
def get_email_title(self):
subject = self.msg['Subject']
value, charset = decode_header(subject)[0]
if charset:
value = value.decode(charset)
# print('邮件主题: {0}'.format(value))
self.email_title = value
#print(value)
def get_sender_info(self):
hdr, addr = parseaddr(self.msg['From'])
# name 发送人邮箱名称, addr 发送人邮箱地址
name, charset = decode_header(hdr)[0]
if charset:
name = name.decode(charset)
self.sender_name = name
self.sender_email = addr
#print('发送人邮箱名称: {0}'.format(name))
#print('发送人邮箱名称: {0},发送人邮箱地址: {1}'.format(name, addr))
def get_email(self):
self.get_latest_email()
self.get_email_title()
self.get_sender_info()
return self.email_title,self.sender_name,self.sender_email,self.nowcount
def close(self):
self.pop3_sever.quit()
Email_Send.py
'''Email_Send.py'''
# 邮箱标题文本
from email.header import Header
# 邮箱内容多项目
from email.mime.multipart import MIMEMultipart
# 邮箱内容文本
from email.mime.text import MIMEText
# 邮箱内容图片
from email.mime.image import MIMEImage
# SMTP
import smtplib
# 邮件发送类
class Email_Send:
# 用来初始化类的函数
def __init__(self, from_addr, to_addr, password,smtp_url):
self.from_addr = from_addr # 寄邮件的邮箱地址
self.to_addr = to_addr # 收邮件的邮箱地址
self.password = password # 寄邮件的允许密码,不是登陆密码
self.smtp = smtplib.SMTP(smtp_url) # 确定SMTP的服务器是163
def msg_stmp(self, sendname, minetext, subject):
msg = MIMEMultipart('mixed') # 新建一个多项的邮件处理变量
msg['From'] = sendname + '<' + self.from_addr + '>' # 发送人的邮箱
msg['To'] = self.to_addr # 接收人的邮箱
msg['Subject'] = Header(subject, 'utf-8') # 标题文本
text = MIMEText(minetext, 'plain', 'utf-8') # 主要文本内容
msg.attach(text) # 添加文本进多项的邮件处理
image = open('1.png', 'rb').read()
mineimage = MIMEImage(image) # 要发送邮件的图片
mineimage['Content-Disposition'] = 'attachment; filename = "people.png"'
msg.attach(mineimage)
return msg
# 发送信息
def sendmessage(self, sendname, minetext, subject):
self.smtp.sendmail(self.from_addr, self.to_addr, self.msg_stmp(sendname, minetext, subject).as_string()) # 发送邮件
# 登录邮箱
def start_stmp(self):
self.smtp.login(self.from_addr, self.password)
# 退出邮箱
def stop_stmp(self):
self.smtp.quit()
main.py
'''main.py'''
from Email_Send import Email_Send
from Email_Received import Email_Received
# opencv
import cv2
# 延时函数
from time import sleep
# 操作系统
import os
# 接入百度api
import baidu
def find_face(path):
face_patterns = cv2.CascadeClassifier(path+"/haarshare/haarcascade_frontalface_default.xml")
eye_patterns = cv2.CascadeClassifier(path+"/haarshare/haarcascade_eye.xml")
cap = cv2.VideoCapture(0)
while True:
rep,frame = cap.read()
faces = face_patterns.detectMultiScale(frame,scaleFactor=1.3,minNeighbors=5)
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
face_area = frame[y:y+h,x:x+w]
eyes = eye_patterns.detectMultiScale(face_area)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(frame,(x+ex,y+ey),(x+ex+ew,y+ey+eh),(255,0,0),2)
cv2.imwrite(path+"/1.png",frame)
if len(faces)>=1:
return 1,len(faces)
# opencv 打开摄像头
def open_camera(path):
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
sleep(0.5)
cv2.imwrite(path+'/1.png',frame)
cap.release()
if __name__ == '__main__':
path = os.getcwd()
smtp_url = {'163': 'smtp.163.com'}
pop3_url = {'163': 'pop.163.com'}
from_addr = "xxx@163.com"
password = "xxx"
to_addr = "xxx@qq.com"
email_title = ''
sender_name = ''
sender_email = ''
msg=''
count = 0
nowcount = 0
email_received = Email_Received(from_addr, password,pop3_url['163'])
email_received.conect_pop()
count = email_received.get_length()
email_received.close()
while True:
email_received = Email_Received(from_addr, password, pop3_url['163'])
email_received.conect_pop()
email_title,sender_name,sender_email,nowcount = email_received.get_email()
sleep(2)
print('nowcount={0},count={1}'.format(nowcount,count))
if nowcount > count:
if "(你发送文件用的用户名)" in sender_email:
if email_title=='1':
open_camera(path)
email_send = Email_Send(from_addr, to_addr, password,smtp_url['163'])
email_send.start_stmp()
email_send.sendmessage('Mao','电脑拍摄','请接受你的图片')
email_send.stop_stmp()
count = nowcount
print("发送成功")
# 语音警报
if "2:" in email_title:
baidu.hecheng_audio(email_title[2:])
count = nowcount
if "3:" in email_title:
counts = int(email_title[2:])
# open the haarcascade
for i in range(counts):
flag, faces_counts = find_face(path)
if flag == 1:
email_send = Email_Send(from_addr, to_addr, password,smtp_url['163'])
email_send.start_stmp()
email_send.sendmessage('Mao','人脸检测',"一共检测到{0}个人再看你的电脑".format(faces_counts))
email_send.stop_stmp()
count = nowcount
print("发送成功")
email_received.close()
如要转载请说明出处:https://blog.csdn.net/xiaokai1999/article/details/105690965
引用:
[1]https://www.jianshu.com/p/ea3c57b6c5e1
[2]https://blog.csdn.net/freesigefei/article/details/51313155
转载:https://blog.csdn.net/xiaokai1999/article/details/105767741