3852浏览
查看: 3852|回复: 3

[教程] 【智控万物】控制海康摄像头(续2)

[复制链接]
Python对接海康摄像头(发送QQ邮件提醒)
1、【演示视频】先使用笔记本摄像头进行测试。

[mw_shl_code=python,false]#监控报警记录,加语音报警
import imutils,cv2,time
#import pyttsx3
#engine = pyttsx3.init()
import smtplib
from email.header import Header                  # 用来设置邮件头和邮件主题
from email.mime.text import MIMEText             # 发送正文只包含简单文本的邮件,引入MIMEText即可
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

def SendEmail(image_name):
  # 发件人和收件人
  sender = 'hbzlzx@qq.com'
  receiver = 'hbzlzx@qq.com'
  
  # 所使用的用来发送邮件的SMTP服务器
  smtpServer = 'smtp.qq.com'
  
  # 发送邮箱的用户名和授权码(不是登录邮箱的密码)
  username = 'hbzlzx@qq.com'
  password = '******************'
  
  mail_title = '监控自动报警'
  mail_body = '这里是邮件的正文'
  mail_msg=  '''
  
  <p>监控截图如下:</p>
  <p><img src="cid:image1"></p>
  '''
   # 创建一个实例
  msg = MIMEMultipart()
  msg['Subject'] = mail_title  # 标题
  msg['From'] = sender  # 邮件中显示的发件人别称
  msg['To'] = receiver  # ...收件人...
  msg.attach(MIMEText(mail_msg, 'html', 'utf-8'))
    # 指定图片为当前目录
  fp = open(image_name, 'rb')
  msgImage = MIMEImage(fp.read())
  fp.close()
    # 定义图片 ID,在 HTML 文本中引用
  msgImage.add_header('Content-ID', '<image1>')
  msg.attach(msgImage)
  ctype = 'application/octet-stream'
  maintype, subtype = ctype.split('/', 1)
    # 附件-图片
  image = MIMEImage(open(image_name, 'rb').read(), _subtype=subtype)
  image.add_header('Content-Disposition', 'attachment', filename='img.jpg')
  msg.attach(image)

  try:
    smtp = smtplib.SMTP()                         # 创建一个连接
    smtp.connect(smtpServer)                      # 连接发送邮件的服务器
    smtp.login(username, password)                # 登录服务器
    smtp.sendmail(sender, receiver, msg.as_string())  # 填入邮件的相关信息并发送
    print("邮件发送成功!!!")
    smtp.quit()
  except smtplib.SMTPException:
    print("邮件发送失败!!!")



camera = cv2.VideoCapture(0)
framefirst=None
avg=None
num=0
j=0
img_name=''
while True:
    text = "Unoccupied"
    # 获取当前帧并初始化occupied/unoccupied文本
    (grabbed, frame) = camera.read()
    # 如果不能抓取到一帧,说明我们到了视频的结尾
    if not grabbed:
        break

    # 调整该帧的大小,并且对其进行高斯模糊
    frame = imutils.resize(frame, width=500)
    imageold=frame.copy()
    #转换为灰阶图像
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    #高斯模糊 这里(21, 21)表示高斯矩阵的长与宽都是5,
    #标准差取0时OpenCV会根据高斯矩阵的尺寸自己计算。概括地讲,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    if framefirst is None :
       framefirst=gray
       continue
    if avg is None:
       avg = gray.copy().astype("float")
       continue
    #图像叠加or图像混合加权实现
    #cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
    #dst = src1 * alpha + src2 * beta + gamma;
    cv2.accumulateWeighted(gray, avg, 0.5)
    gray = cv2.absdiff(gray, cv2.convertScaleAbs(avg))

    # 二值化处理,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图 ,
    #像素高于阈值时,给像素赋予新值,否则,赋予另外一种颜色。函数是cv2.threshold()
    ret, binary = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)
    #学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等
    #我们要学习的函数有:cv2.erode(),cv2.dilate(),cv2.morphologyEx()等
    #与卷积核对应的原图像的像素值中只要有一个是1,中心元 素的像素值就是1。所以这个操作会增加图像中的白色区域(前景)。
    #一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。
    #所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。
    thresh = cv2.dilate(binary, None, iterations=2)
    #binary:寻找轮廓的图像
    #轮廓的检索模式:cv2.RETR_EXTERNAL表示只检测外轮廓
                    #cv2.RETR_TREE建立一个等级树结构的轮廓。
                    #cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    #第一个参数是指明在哪幅图像上绘制轮廓;
    #第二个参数是轮廓本身,在Python中是一个list。
    #第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1则绘制其中的所有轮廓。
    #thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。
    #
    cv2.drawContours(frame,contours,-1,(0,0,255),3)  

    for c in contours:
        # if the contour is too small, ignore it
        if cv2.contourArea(c) < 5000:
            continue

        # 计算轮廓线的外框, 在当前帧上画出外框,
        # 并且更新文本
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        text = "Occupied"
    if text=="Occupied" :
       num+=1
       if num>20 :
    # 在当前帧上标记文本和时间戳
        now = int(time.time())     # 1533952277
        timeArray = time.localtime(now)

        otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)
        cv2.putText(imageold, "Room Status: {}".format(text), (10, 20),
        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        cv2.putText(imageold, otherStyleTime, (10, imageold.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
        img_name=r'./img/image'+str(j) + '.jpg'
        cv2.imwrite(img_name, imageold)
        SendEmail(img_name)
        j+=1
        num=0
        #engine.say('报警,你的照片已记录,将作为证据。请你立刻停止违法行为')
        #engine.runAndWait()

    cv2.imshow("contours", frame)
    cv2.imshow("Gray", gray)
   
    cv2.imshow("binary", binary)
    key = cv2.waitKey(1) & 0xFF

    # 如果q键被按下,跳出循环
    if key == ord("q"):
        break

# 清理摄像机资源并关闭打开的窗口
camera.release()
cv2.destroyAllWindows()[/mw_shl_code]

2、使用监控摄像头进行测试(代码)。
[mw_shl_code=python,false]#监控报警记录,加语音报警
import imutils,cv2,time
#import pyttsx3
#engine = pyttsx3.init()
import smtplib
from email.header import Header                  # 用来设置邮件头和邮件主题
from email.mime.text import MIMEText             # 发送正文只包含简单文本的邮件,引入MIMEText即可
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

def SendEmail(image_name):
  # 发件人和收件人
  sender = 'hbzlzx@qq.com'
  receiver = 'hbzlzx@qq.com'
  
  # 所使用的用来发送邮件的SMTP服务器
  smtpServer = 'smtp.qq.com'
  
  # 发送邮箱的用户名和授权码(不是登录邮箱的密码)
  username = 'hbzlzx@qq.com'
  password = '******************'
  
  mail_title = '监控自动报警'
  mail_body = '这里是邮件的正文'
  mail_msg=  '''
  
  <p>监控截图如下:</p>
  <p><img src="cid:image1"></p>
  '''
   # 创建一个实例
  msg = MIMEMultipart()
  msg['Subject'] = mail_title  # 标题
  msg['From'] = sender  # 邮件中显示的发件人别称
  msg['To'] = receiver  # ...收件人...
  msg.attach(MIMEText(mail_msg, 'html', 'utf-8'))
    # 指定图片为当前目录
  fp = open(image_name, 'rb')
  msgImage = MIMEImage(fp.read())
  fp.close()
    # 定义图片 ID,在 HTML 文本中引用
  msgImage.add_header('Content-ID', '<image1>')
  msg.attach(msgImage)
  ctype = 'application/octet-stream'
  maintype, subtype = ctype.split('/', 1)
    # 附件-图片
  image = MIMEImage(open(image_name, 'rb').read(), _subtype=subtype)
  image.add_header('Content-Disposition', 'attachment', filename='img.jpg')
  msg.attach(image)

  try:
    smtp = smtplib.SMTP()                         # 创建一个连接
    smtp.connect(smtpServer)                      # 连接发送邮件的服务器
    smtp.login(username, password)                # 登录服务器
    smtp.sendmail(sender, receiver, msg.as_string())  # 填入邮件的相关信息并发送
    print("邮件发送成功!!!")
    smtp.quit()
  except smtplib.SMTPException:
    print("邮件发送失败!!!")



camera = cv2.VideoCapture(0)
framefirst=None
avg=None
num=0
j=0
img_name=''
url = 'rtsp://admin:a12345678@172.20.0.24:554/1'
cap = cv2.VideoCapture(url)
while True:
    text = "Unoccupied"
    # 获取当前帧并初始化occupied/unoccupied文本
   # Capture frame-by-frame
    ret, frame = cap.read()

    # 调整该帧的大小,并且对其进行高斯模糊
   
    frame = imutils.resize(frame, width=500)
    imageold=frame.copy()
    #转换为灰阶图像
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    #高斯模糊 这里(21, 21)表示高斯矩阵的长与宽都是5,
    #标准差取0时OpenCV会根据高斯矩阵的尺寸自己计算。概括地讲,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    if framefirst is None :
       framefirst=gray
       continue
    if avg is None:
       avg = gray.copy().astype("float")
       continue
    #图像叠加or图像混合加权实现
    #cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
    #dst = src1 * alpha + src2 * beta + gamma;
    cv2.accumulateWeighted(gray, avg, 0.5)
    gray = cv2.absdiff(gray, cv2.convertScaleAbs(avg))

    # 二值化处理,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图 ,
    #像素高于阈值时,给像素赋予新值,否则,赋予另外一种颜色。函数是cv2.threshold()
    ret, binary = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)
    #学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等
    #我们要学习的函数有:cv2.erode(),cv2.dilate(),cv2.morphologyEx()等
    #与卷积核对应的原图像的像素值中只要有一个是1,中心元 素的像素值就是1。所以这个操作会增加图像中的白色区域(前景)。
    #一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。
    #所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。
    thresh = cv2.dilate(binary, None, iterations=2)
    #binary:寻找轮廓的图像
    #轮廓的检索模式:cv2.RETR_EXTERNAL表示只检测外轮廓
                    #cv2.RETR_TREE建立一个等级树结构的轮廓。
                    #cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    #第一个参数是指明在哪幅图像上绘制轮廓;
    #第二个参数是轮廓本身,在Python中是一个list。
    #第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1则绘制其中的所有轮廓。
    #thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。
    #
    cv2.drawContours(frame,contours,-1,(0,0,255),3)  

    for c in contours:
        # if the contour is too small, ignore it
        if cv2.contourArea(c) < 5000:
            continue

        # 计算轮廓线的外框, 在当前帧上画出外框,
        # 并且更新文本
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        text = "Occupied"
    if text=="Occupied" :
       num+=1
       if num>20 :
    # 在当前帧上标记文本和时间戳
        now = int(time.time())     # 1533952277
        timeArray = time.localtime(now)

        otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)
        cv2.putText(imageold, "Room Status: {}".format(text), (10, 20),
        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        cv2.putText(imageold, otherStyleTime, (10, imageold.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
        img_name=r'./img/image'+str(j) + '.jpg'
        cv2.imwrite(img_name, imageold)
        SendEmail(img_name)
        j+=1
        num=0
        #engine.say('报警,你的照片已记录,将作为证据。请你立刻停止违法行为')
        #engine.runAndWait()

    cv2.imshow("contours", frame)
    cv2.imshow("Gray", gray)
   
    cv2.imshow("binary", binary)
    key = cv2.waitKey(1) & 0xFF

    # 如果q键被按下,跳出循环
    if key == ord("q"):
        break

# 清理摄像机资源并关闭打开的窗口
camera.release()
cv2.destroyAllWindows()[/mw_shl_code]
注:学校的监控没有连入互联网,接入监控网络就不能上网,只能有时间回家试一下了。

ijvylcjwmezscadh

云天  初级技神
 楼主|

发表于 2020-7-27 21:59:50

回复

使用道具 举报

云天  初级技神
 楼主|

发表于 2020-7-27 22:22:09

cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
回复

使用道具 举报

离恨天  学徒

发表于 2021-8-24 16:33:07

写的详细,大赞
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail