前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有贼出没?看我用python来捉"贼"

有贼出没?看我用python来捉"贼"

作者头像
赵云龙龙
发布2019-11-03 21:06:46
5860
发布2019-11-03 21:06:46
举报
文章被收录于专栏:python爱好部落python爱好部落

最近丢东西了,接二连三丢东西,很是糟心。是谁干的?真想把他给揪出来。 自己用python捣鼓了个程序,看看效果。

最近自己的工位老是丢东西,关键只丢一样东西,而且每天早上来,桌子上都是乱七八糟的。像是遭了贼。

本来上班心情就不是那么愉快,这下心情更不爽了。 也没丢啥值钱的东西,就是苹果手机充电的线。本来测试的时候也要用,就插在电脑上没拔,结果总是丢。

为这点破事跟人事说,也犯不着。也许谁拿去用用,说不定就还回来了。结果几个星期过去了,没有还的,只有丢的,接二连三,感觉是盯上我了。

丢到第四根的时候,扛不住了,害我自己的手机天天没地方充电。测试机也没法充电。

我得想办法把他找出来,找他要回来。 我自己的电脑是一个macpro, 很大的屏,平时也不关机,它不有个摄像头么?我得从这上面下功夫。

代码语言:javascript
复制
import cv2

def make_photo():
    """使用opencv拍照"""
    cap = cv2.VideoCapture(0)  # 默认的摄像头
    while True:
        ret, frame = cap.read()
        if ret:
            cv2.imshow("capture", frame)  # 弹窗口
            # 等待按键q操作关闭摄像头
            if cv2.waitKey(1) & 0xFF == ord('q'):
                file_name = "theif.jpeg"
                cv2.imwrite(file_name, frame)
                break
        else:
            break

    cap.release()
    cv2.destroyAllWindows()


def make_video():
    """使用opencv录像"""
    cap = cv2.VideoCapture(0)  # 默认的摄像头
    # 指定视频代码
    fourcc = cv2.VideoWriter_fourcc(*"DIVX")
    out = cv2.VideoWriter('thief.mp4', fourcc, 20.0, (640, 480))
    while (cap.isOpened()):
        ret, frame = cap.read()
        if ret:
            out.write(frame)
            #
            cv2.imshow('frame', frame)
            # 等待按键q操作关闭摄像头
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break
    cap.release()
    out.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    make_video()
    make_photo()

运行起来似乎还可以。

但是有个问题,如果我一直开机,一直拍照或者录制视频。感觉存储空间会抗不住。如果镜头有变化,才录制,这样会减少很多无用的录制,而且回放也简单很多。 改进一下:

代码语言:javascript
复制
import cv2
import numpy, os, sys


def isPicChanged(dividePar, pointDelta, judgeTh):
    '''
    通过前后帧对比,判断画面是否改变
    :param dividePar = 40 # 对比间隔点,减少计算量
    :param pointDelta = 500 # 像素点的差异大于该值认为是差异点
    :param judgeTh = 640 # 判断变化画面大小的阈值:画面(1/judgeTh)
    '''

    capIdx = 0  # 截图命名
    camIdx = -1
    while (int(camIdx) < 0 or int(camIdx) > 10):
        print("enter camera index in 0 and 10:")
        camIdx = int(input())

    if not (os.path.isdir('cap')):  # 创建存放截图的文件夹
        os.system('mkdir -p {}'.format("cap"))

    cap = cv2.VideoCapture(camIdx)  # 调整参数实现读取视频或调用摄像头
    ret, frameBak = cap.read()
    for i in range(10):  # 刚打开相机时,曝光不稳定,清理10张
        ret, frameBak = cap.read()

    frameWidth = int(cap.get(cv2.WIDTH))
    frameHeight = int(cap.get(cv2.HEIGHT))
    print("frameWidth:{},frameHeight:{}".format(frameWidth, frameHeight))
    if frameWidth == 0:
        exit("camera is not available.")

    while True:
        frameBak = frame
        ret, frame = cap.read()
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    isPicChanged(4, 50, 64)

测试一下,效果还真有。镜头变化了,才录制。 后面想想,还有个问题,如果镜头变化很久,存储也会吃紧。 于是又写个程序,隔段时间,来检测图片的变化,如果相似度太高的,可以删除一部分。 ssim对比:

代码语言:javascript
复制
from skimage.measure import compare_ssim
import cv2

class CompareImage():

    def compare_image(self, path_image1, path_image2):

        imageA = cv2.imread(path_image1)
        imageB = cv2.imread(path_image2)

        grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
        grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

        (score, diff) = compare_ssim(grayA, grayB, full=True)
        print("SSIM: {}".format(score))
        return score


compare_image = CompareImage()
compare_image.compare_image("1.jpg", "2.jpg")

直方图对比:

代码语言:javascript
复制
import cv2
import numpy as py
 
img = cv2.imread("../image-030.png")
img1 = cv2.imread("../image-002.jpg")
# 计算图img的直方图
H1 = cv2.calcHist([img], [1], None, [256],[0,256])
H1 = cv2.normalize(H1, H1, 0, 1, cv2.NORM_MINMAX, -1) # 对图片进行归一化处理
 
# 计算图img2的直方图
H2 = cv2.calcHist([img1], [1], None, [256],[0,256])
H2 = cv2.normalize(H2, H2, 0, 1, cv2.NORM_MINMAX, -1)
 
# 利用compareHist()进行比较相似度
similarity = cv2.compareHist(H1, H2,0)
print(similarity)

还有哈希对比等。 这样有可以节约一些空间。

后面还想深入一点,人脸识别。可是我没那么厚的功底,就没费那大的劲。而且我的代码似乎也够用了。 这种监控,还可以应用到家用摄像头。 当然,涉及到隐私问题。所以这也是一个很敏感的问题,所以上面的代码也不全,防止有人干坏事。

最后我抓到“贼”了没?请听下回分解。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python爱好部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档