工作需要,之前有点易语言知识,经过一星期摸索+百度,各种伸手后一句一句百度用法,个中艰辛一言难尽。各位大神勿喷,小弟在此献丑一下,除了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()

以下为实际运行效果:

python 安装海康摄像头依赖 海康工业相机 python_python 安装海康摄像头依赖

python 安装海康摄像头依赖 海康工业相机 python_python_02