分享

用 Python 制作家用防盗工具

 求知_时光 2020-01-29

简介:利用python调用摄像头截图功能,在镜头发生变化时进行截图,并通过ichat远程发送,实现远程报警功能。

整体思路:先用cv2函数调用电脑的摄像头,开启截图功能,再通过cv2函数将前后2张图片分别转换为一维数组,依次循环比较的2个1维数组的相关系数,相关系数越大,代表两张图片越相似,越小代表图片越不相同,图片不相同就意味着摄像头前有物体在动,把发生变化的图片保存,并利用itchat函数通过微信将图片发给我,最终实现智能监控功能。

第一步:调用监控设备,循环截图

利用CV2函数,调用监控设备,0代表第一个摄像设备,就像列表取元素一样,从0开始,如何你是土豪可以多买几个外置摄像头,从而实现全方位监控。

开启截图保存功能,ret返回值为True或者False,表示截图成功与否,img返回值是图片的原始数据,这里直接将其保存为img1.png.

肯定会有人问,保存那么多图片岂不是很耗费内存?
那是自然不会的,这个我也想到了,我是这样解决的,把每次循环的截图进行覆盖式保存,即只用img1、img2命名,依次轮换为前后者。例如,第1次保存为img1.png,第2次保存为img2.png,比较两者是否相同,若相同则把img1.png舍弃,把第3次重新存为img1.png再与img2.png进行比较;如果有变化则把img2保存到另一个文件夹后再舍弃,把第3次重新存为img1.png再与img2.png进行比较。

第二步:详细对比前后2张截图

比较图片相似度的方法很多,这里采取以下方法

需要注意的是img1和img2为图片的保存地址,先将图片转换为浮点型数组,再将数组转换为1维,通过比较2个1维数组的相似系数来确定相似度,相似系数值越大,相似度越高,相似系数越小,相似度越低。

第三步:保存发生变化的截图

这里定义相似度小于0.95为发生变化,每次的变化都将后者图片保存到另一个文件夹备份,并以时间戳命名,必须取铁证。

第四步:通过微信发送发生变化的截图

主要利用itchat函数,它可以通过调用网页版微信来操控发送微信消息以及图片、视频等文件,但是第1次需要扫一下弹出来的二维码,后面就不需要了。
第二行代码表示要找到你想把图片发送给谁,在单引号内把你自己的昵称写上就妥,room为返回的json信息,内含你的资料信息。
第三行代码是找出你微信号的“身份证号”,由一段字符组成。
第四行代码是把图片发送出去,file表示想要发送图片的文件地址。

import cv2
import time
from PIL import Image
import math
import operator
from functools import reduce
import numpy as np
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import itchat
def SendWeixin(file):
    itchat.auto_login(hotReload=True)  # 启动你的微信
    room = itchat.search_friends(name=r'')  # 这里输入你好友的名字或备注。
    userName = room[0]['UserName']
    print(userName)
    itchat.send_image(file, toUserName=userName)
    print('success')
def CompareImage(img1,img2): #比较2张图片是否相同
    stdimg = cv2.imread(str(img1), 0)#读入图片
    ocimg = cv2.imread(str(img2), 0)
    stdimg = np.float32(stdimg) #转换为浮点型数组
    ocimg = np.float32(ocimg)
    stdimg = np.ndarray.flatten(stdimg)#将数组折叠成一维
    ocimg = np.ndarray.flatten(ocimg)
    imgocr = np.corrcoef(stdimg, ocimg) #计算两组数据的相关系数
    return (imgocr[01])
def SaveImage(img1,img2):
    PreciseTime = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) #时间
    result = CompareImage(img1, img2)
    print(result)
    if result < 0.9:  # 相似度小于0.95则报警
        file='写入你的文件名\{0}.png'.format(PreciseTime)#保存图片
        I = Image.open(img2)
        I.save(file)
        SendWeixin(file)
def main(): #主函数
    cap = cv2.VideoCapture(0#启动第1个摄像头设备
    n=1 #用于区分截图保存名称,奇数保存为img1,偶数保存为img2
    while True:
        time.sleep(2#间隔为0.5秒,可以更改
        # get a frame
        if n==1:
            ret, img1 = cap.read()
            print(img1)
            cv2.imwrite('img1.png', img1)
            img1 = '写入你的文件名\img1.png'
        elif n%2==1 and n!=1:
            ret, img1 = cap.read()
            cv2.imwrite('img1.png', img1)
            img1 = '写入你的文件名\img1.png'
            img2 = '写入你的文件名\img2.png'
            SaveImage(img2,img1)
        elif n%2==0:
            ret, img2 = cap.read()
            cv2.imwrite('img2.png', img2)
            img1 = '写入你的文件名\img1.png'
            img2 = '写入你的文件名\img2.png'
            SaveImage(img1, img2)
        n=n+1
    cap.release()
    cv2.destroyAllWindows()
if __name__=='__main__':
    main()

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约