基于openCV和PythonSMTP的天眼系统

来源:互联网 发布:保存文件安全数据 编辑:程序博客网 时间:2024/04/28 04:14

这个小系统是把两个简单功能组合到了一起。
先讲一下算法大致的思路:
首先是openCV不断检测,当检测到有像素变化且大于一定阈值时,更新状态队列,如果该队列list的最近5次有3次检测到异常,就捕捉照片,再使用Python SMTP发送邮件到指定邮箱。
几个注意的地方:
1、程序名 不能为 email.py
2、发送文字内容不能为 test、测试等
3、时间触发、照片限制、阈值设置在程序里面改
4、运行环境: win10 64 +python 2.7+ openCV 2.4.13
代码 开源 如下:

#coding=utf8#!/usr/bin/pythonimport smtplibfrom email.MIMEText import MIMETextfrom email.MIMEImage import MIMEImagefrom email. MIMEMultipart import MIMEMultipartfrom email.header import Headerimport sysimport cv2cap1=cv2.VideoCapture(0)value1=0value2=[]t=1BUF=0time=0qq=0mail_user = "XXXXXXXX@qq.com"mail_pass  = "~~~~~~~~~"# 这个密码不是qq密码,而是在qq激活SMTP服务的授权码sender = "XXXXXXXX@qq.com"firstframe=Nones=1time=0receivers = ['XXXXXX@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱def sendEmail(fileName):#创建一个带附件的实例    message = MIMEMultipart()    message['From'] = Header("当前情况监视实时监控", 'utf-8')    message['To'] =  Header("当前情况监控", 'utf-8')    subject = '当前情况监控'    message['Subject'] = Header(subject, 'utf-8')    #邮件正文内容    message.attach(MIMEText('当前情况监视实时监控', 'plain', 'utf-8'))    att3= MIMEImage(open(fileName, 'rb').read())    att3["Content-Type"] = 'application/octet-stream'    att3["Content-Disposition"] = 'attachment; filename="faces.jpg"'    message.attach(att3)    try:        smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)        smtpObj .login(mail_user,mail_pass)        smtpObj.sendmail(sender, receivers, message.as_string())        smtpObj.quit()        print "邮件发送成功"        #time=    except smtplib.SMTPException:        print "Error: 无法发送邮件"while(1):        ret1,frame=cap1.read()        #imagepath='C:\Users\sx\Desktop\FBB.png'        if t-(t/30)*30==0:                BUF=1        t=t+1        s=s+1        #image = cv2.imread('test.jpg')        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)          gray=cv2.GaussianBlur(gray,(21,21),0)          if firstframe is None:                  firstframe=gray                  continue                 frameDelta = cv2.absdiff(firstframe,gray)          thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]          thresh = cv2.dilate(thresh, None, iterations=2)          (cnts,_)= cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)        wh=-1000        xx=-1000        yy=-1000        ww=0        hh=0        print len(cnts)        if(len(cnts)>1):                for c in cnts:                        if 100<cv2.contourArea(c)<100000:                                qq+=1                                x,y,w,h=cv2.boundingRect(c)                                if w*h>wh:                                                        wh=w*h                                        ww=w                                        hh=h                                        xx=x                                        yy=y        try:                if wh!=-1000:                        print 'qqqqqqqqqqqq',s                        cv2.rectangle(frame,(xx,yy),(xx+ww,yy+hh),(0,255,0),3)        except:                print 'ff'        if len(cnts)>=2:                    value2.append(1)        else:                    value2.append(0)        if t>8 :                print len(value2),t                if (value2[t-3]+value2[t-4]+value2[t-5]+value2[t-6]+value2[t-7]>=3) and s>200 and s<2000:                        if BUF==1:                                time+=1                                if time<4:                                        print "I will send email"                                        cv2.imwrite('faces.jpg',frame)                                        sendEmail('faces.jpg')                                if time>4:                                        time=4                                BUF=0                else :                        if BUF==1:                                print "NO PEOPLE"                                BUF=0             if t==1000 :                t=0                value2=value2[len(value2)-999:len(value2)]        cv2.imshow("Find res Faces!",frame)        firstframe=gray        if cv2.waitKey(2) & 0xFF == ord('q'):                 print "break"

下面是运行结果图:
这里写图片描述

图片:
这里写图片描述

当然还可以添加,人脸识别,主要是基于HOG特征的人脸识别,加入openCV人脸识别代码如下:

while(1):    ret1,img1=cap1.read()    if(ret1):        #imagepath='C:\Users\sx\Desktop\FBB.png'        if t-(t/10)*10==0:            BUF=1        t=t+1        image = img1        #image = cv2.imread('test.jpg')        gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)        #cv2.imshow("Findaces!",gray)        face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')        #face_cascade = cv2.CascadeClassifier(r'hogcascade_pedestrians.xml')        #haarcascade_profileface.xml,haarcascade_mcs_upperbody,        faces = face_cascade.detectMultiScale(        gray,        scaleFactor = 1.15,        minNeighbors = 2,        minSize = (2,2),        flags = cv2.cv.CV_HAAR_SCALE_IMAGE        )        for(x,y,w,h) in faces:            cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)        if len(faces)>=1:            value2.append(1)        else:            value2.append(0)        if t>6 :            #print len(value2),t            if (value2[t-2]+value2[t-3]+value2[t-4]+value2[t-5]+value2[t-6]==5):                if BUF==1:                    print "I will send email"                    cv2.imwrite('faces.jpg',image)                    sendEmail('faces.jpg')                    BUF=0            else :                if BUF==1:                    print "NO PEOPLE"                    BUF=0             if t==1000 :            t=0            value2=value2[len(value2)-999:len(value2)]        cv2.imshow("Find res Faces!",image)        if cv2.waitKey(2) & 0xFF == ord('q'):             print "break"

结果如图:

丑爆了

原创粉丝点击