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