[Python Study Notes]物体运动检测
基于opencv的cv2模块实现
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- >>文件: iot_client.py
- >>作者: liu yang
- >>邮箱: liuyang0001@outlook.com
- >>博客: www.cnblogs.com/liu66blog
- >>博客: liuyang1.club (抱歉,域名备案中,稍后恢复访问)
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import cv2
- import numpy as np
- import easygui
- import datetime
- from twilio.rest import Client
- # 打开摄像头
- camera= cv2.VideoCapture(0)
- # 如果摄像头打开失败
- if camera.isOpened() == False:
- # 给与友好性提示
- easygui.msgbox("\n\n\n\n\n\n 请保证摄像头可以正常被打开,请检查硬件后重新运行",title='提示框',ok_button='确定')
- # 得到摄像头的图像尺寸
- size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
- int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
- # 打印尺寸
- print('size:'+repr(size))
- es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,4))
- kernel = np.ones((5,5),np.uint8)
- background = None
- flag = 0
- while True:
- # 有没有检测到的文本
- text = "Undetected"
- # 读取摄像头的参数
- grabbed , frame_lwpCV=camera.read()
- try:
- # 将图像转换为RGB
- gray_lwpCV = cv2.cvtColor(frame_lwpCV,cv2.COLOR_RGB2GRAY)
- # 将图像进行高斯滤波,去除噪点
- gray_lwpCV = cv2.GaussianBlur(gray_lwpCV,(25,25),3)
- except cv2.error:
- break
- # 判断是否有标准的背景图,如果没有就将上面摄像头采集的第一帧的图像作为背景图
- if background is None:
- background = gray_lwpCV
- continue
- # 将两个图像进行比较
- diff = cv2.absdiff(background,gray_lwpCV)
- diff = cv2.threshold(diff,50,255,cv2.THRESH_BINARY)[1]
- # 进行3次膨胀
- diff = cv2.dilate(diff,es,iterations=3)
- # 忽略掉一些很小的因素
- image , contours , hierarchy = cv2.findContours(diff.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
- for c in contours:
- # 如果变化的狂过小,则忽略
- if cv2.contourArea(c) < 2000:
- continue
- (x, y, w, h) = cv2.boundingRect(c)
- cv2.rectangle(frame_lwpCV, (x, y), (x + w, y + h), (0, 255, 0), 2)
- # 有物体闯入到背景中,以文本标记
- text = "Detected"
- # 如果文本标记为无
- if text == "Undetected" :
- # 在图像上标出
- cv2.putText(frame_lwpCV,"Motion: {}".format(text),(10,20),
- cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)
- # 放置时间戳
- cv2.putText(frame_lwpCV,datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
- (10,frame_lwpCV.shape[0]-10),cv2.FONT_HERSHEY_SIMPLEX,0.35,(0,255,0),2)
- # 如果检测到
- if text == "Detected" :
- cv2.putText(frame_lwpCV,"Motion: {}".format(text),(10,20),
- cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),2)
- cv2.putText(frame_lwpCV,datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
- (10,frame_lwpCV.shape[0]-10),cv2.FONT_HERSHEY_SIMPLEX,0.35,(0,255,0),2)
- # 蒋告警标志位置为1
- flag=1
- # 判断告警标志位
- if flag == 1:
- # 接入一些接口,进行对用户的警示,微信,丁丁,短信 ...等等
- # 然后将标志位置为0
- pass
- # 显示图像
- cv2.imshow('contours',frame_lwpCV)
- # 灰度图像的显示
- # cv2.imshow('dis',diff)
- # 添加退出键--q
- # 按下退出本次监测
- key = cv2.waitKey(1) & 0xff
- if key == ord('q'):
- break
- # 退出后释放摄像头
- camera.release()
- cv2.destroyAllWindows()
- # 声明:该代码源于腾讯课堂-动脑学院-Python公开课,并加以适当修改
[Python Study Notes]物体运动检测的更多相关文章
- [Python Study Notes]匿名函数
Python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的.在Python中,lambda作 ...
- [Python Study Notes]字符串处理技巧(持续更新)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- [Python Study Notes]with的使用
在 Python 2.5 中, with 关键字被加入.它将常用的 try ... except ... finally ... 模式很方便的被复用.看一个最经典的例子: with open('fil ...
- [Python Study Notes]实现对键盘控制与监控
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- [Python Study Notes]实现对鼠标控制
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- [Python Study Notes]批量将wold转换为pdf
本文代码,由原ppt2pdf.py进行改写 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- [Python Study Notes]批量将ppt转换为pdf v1.0
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- [Python Study Notes]CS架构远程访问获取信息--SERVER端v2.0
更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''' ...
- [Python Study Notes]CS架构远程访问获取信息--Client端v2.0
更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 效果图: '''''''''''''''''''''' ...
随机推荐
- asp.net IE 页面刷新固定位置
MaintainScrollPositionOnPostback="true" 可能我们会经常遇到这种情况,当页面内容比较多的时候,当用户执行操作执行一次页面回送后,页面又重新从顶 ...
- Redis 存储机制
Redis存储机制分成两种Snapshot和AOF.无论是那种机制,Redis都是将数据存储在内存中. Snapshot工作原理: 是将数据先存储在内存,然后当数据累计达到某些设定的伐值的时候,就会触 ...
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E
题意:减前面的数,加后面的数,保证最后不剩下数,加减次数要相同: 题解:emmmmm,看出是个贪心,先对价值排序,相同就对下标排序,规律是每次找第一个,然后从后往前找没有使用过的下表比他大的第一个,相 ...
- idea配置sliksvn解决无法配置1.8 format 问题
1. 2. 3. 4. 5. 6. 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦拉拉拉拉啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦 ...
- tableau join 与格式问题
一开始我没有找到它的join 方法.其实应该是编辑相应的join关系.选择数据源,选择字段.数据源是可以选择的. 剩下的计算问题,要再弄下.不好说,这个其实烦了我很久了. 高级选项,扩展最大行数.即可 ...
- 17 python 内置函数
内置函数:Python的内部自带的函数 作用域相关: 基于字典的形式获取局部变量和全局变量 globals()——获取全局变量的ha1 locals()——获取执行本方法所在命名空间内的局部变量的字典 ...
- Android 禁止屏幕旋转、避免转屏时重启Activity
一.禁止屏幕旋转 在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android:screenOrientation属性: 可选项: landscape = 横 ...
- 2017 年比较 Angular、React、Vue 三剑客(转载)
为 web 应用选择 JavaScript 开发框架是一件很费脑筋的事.现如今 Angular 和 React 非常流行,并且最近出现的新贵 VueJS 同样博得了很多人的关注.更重要的是,这只是一些 ...
- [BZOJ5249][多省联测2018]IIIDX
bzoj luogu sol 首先可以把依赖关系转成一个森林.自下而上维护出每个点的\(size\),表示这关解锁以后一共有多少关. 考虑没有重复数字的情况. 直接从小往大贪心把每个数赋给当前已解锁的 ...
- LeetCode 333. Largest BST Subtree
原题链接在这里:https://leetcode.com/problems/largest-bst-subtree/ 题目: Given a binary tree, find the largest ...