Python初学者伸手党第一个python实际应用案例:通过海康威视摄像机判断平开门的开关状态并发送企业微信报警信息

该博客介绍了一个使用Python进行实时视频流处理的项目,通过OpenCV抓取和分析摄像头图像,进行人脸识别,并结合易语言知识,实现与硬件交互及企业微信消息推送。当检测到特定情况超过预设阈值时,程序会触发警告并发送企业微信通知。
摘要由CSDN通过智能技术生成

 工作需要,之前有点易语言知识,经过一星期摸索+百度,各种伸手后一句一句百度用法,个中艰辛一言难尽。各位大神勿喷,小弟在此献丑一下,除了post那个py,其他的都可以在网上找到,发给各位初学者参考参考,希望初学者们能少走点弯路。

# coding = utf-8
#加载time模块 只用到了延时功能
import time
#加载opencv模块 图像处理模块
import cv2
#加载numpy模块
import numpy as np
#加载testtt.py里的main 后面要调用  功能是通过POST经过人脸识别盒子发送一个开门信号
from testtt import main
#加载wxworksend.py里的send2wechat 后面要调用   功能是通过企业微信发送文本消息
from wxworksend import send2wechat
#加载imgsend.py 后面要调用   功能是给企业微信发送图文 与wxworksend.py一样 区别就是可以发图
from imgsend import *
#加载PIL里的Image 处理图像用
from PIL import Image
#计数用的变量 记录图像中与模板相似度低于判断标准时的次数
count = 0
#计数用的变量 记录图像中与模板相似度高于判断标准时的次数
count_1 = 0
#变量 摄像机IP地址
ip = '10.32.3.56'
#变量 方便修改 这里是模板的路径
filepath = 'e:/cccccc.png'
#变量 方便修改 提示信息
message_1 = '测试---甲醇北-平开门恢复'
message = '测试---甲醇北-平开门异常,点击查看监控截图→→'
#取一帧图像 赋予变量img1
img1 = cv2.VideoCapture('rtsp://admin:admin12345@' + ip + ':554/Streaming/Channels/1')
#字面意思:当img1成功打开的时候:
while img1.isOpened():
   #读取图像信息并赋值img变量
   ret, img = img1.read()
   #try是防止报错时程序停止运行
   try:
      #这里的路径是取到的一帧图像保存到本地的路径
      path = "e:/north.jpg"
      #将img图像转成灰度图 赋值给img_1
      img_1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      #将灰度图写到本地
      cv2.imwrite(path, img_1)
      #用PIL里的Image打开上面的图像文件 赋值给im
      im = Image.open(path)
      #截取图像中一部分需要的区域 赋值给region    这里的1400,400是截图起始点的水平和垂直坐标,也就是左上角,1490,480是截图终止点的水平和垂直坐标,也就是右下角
      region = im.crop((1400, 400, 1490, 480))
      #将PIL图像转成opencv图像 赋值给img2  可以理解为两种不同的读取图像的方式
      img2 = np.asarray(region)
      #下面三行是查看img2图像的 生成一个名为123的窗口 窗口内容是img2的内容 也就自己调试时用 所以注释掉了
      #cv2.imshow('123',img2)
      #waitkey必须要有 不然图像窗口会一闪而过    后面的表示触发按键Q键 如果按下Q键 执行下面一句
      #if cv2.waitKey(0) & 0xFF == ord('q'):
      #打断 结束当前运行的程序
      #  break
      #读取模板图像 赋值给template变量
      template = cv2.imread(filepath, 0)
      #对比模板图和上面处理完成的实时图img2,并将结果矩阵保存到res变量
      res = cv2.matchTemplate(img2, template, cv2.TM_CCOEFF_NORMED)
      #阈值
      threshold = 0.72
      #判断是否符合大于等于threshold这个条件 返回值赋值给res_ts 这句没用到 伸手拿来时忘删了
      #res_ts = np.where(res >= threshold)
      #找出res这个矩阵中的最大值和最小值
      min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
      #如果最大值大于阈值 就顺序往下执行 否则运行else
      if max_val > threshold:
         #count_1=count_1+1
         count_1 += 1
         #如果count_1的值大于222 count和count_1就都=0
         if count_1 > 222:
            #如果count的值在大于222的时候大于555 就执行send2wechat
            if count > 555:
               #发送消息到企业微信
               send2wechat(AgentId, Secret, CompanyId,message_1)
            count = 0
            count_1 = 0
      else:
         #count=count+1 count_1=0
         count += 1
         count_1 = 0
         #如果count等于555或者等于2000或者等于5000或者等于10000时 就顺序执行
         if count == 555 or count == 2000 or count == 5000 or count == 10000:
            #调用imgsend.py里的Wechat_Info里的send_violence_warning 并将结果赋值给result
            result = Wechat_Info().send_violence_warning(message,path)
            #输出result信息
            print(result)
            #删除文件
            del path
            #调用testtt.py里的main
            main("10.32.3.51")
            main("10.32.3.58")
      #输出res矩阵中的最大值(可以理解为相似度)、异常数值、正常数值
      print(max_val, '                    ', count, count_1)
   #配合try使用的 程序发生错误时输出错误信息
   except Exception as n:
      print(n)
      #等待3秒再继续执行
      time.sleep(3)
      #重新取帧、读取
      img1 = cv2.VideoCapture('rtsp://admin:admin12345@' + ip + ':554/Streaming/Channels/1')
      img = img1.read()
else:
   send2wechat(AgentId, Secret, CompanyId, '摄像机取流失败,请检查供电或网络设备')
#释放资源
img1.release()
#关闭所有窗口
cv2.destroyAllWindows()

以下为实际运行效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值