python+openCV利用摄像头实现人员活动检测


Posted in Python onJune 22, 2019

本文实例为大家分享了python+openCV利用摄像头实现人员活动检测的具体代码,供大家参考,具体内容如下

1.前言

最近在做个机器人比赛,其中一项要求是让机器人实现对是否有人员活动的检测,所以就先拿PC端写一下,准备移植到机器人的树莓派。

2.工具

工具还是简单的python+视觉模块openCV,代码量也比较少。很简单就可以实现

3.人员检测的原理  

 从图书馆借了一本《特征提取与图像处理(第二版)》,是Mark S.Nixon和Alberto S.Aguado写的,其中讲了跟多关于检测图像运动的方法,我们选取了最简单的一种。

说的很高大上,简单的说一下原理。假设有两帧不同时间采集的图像,检测运动的最简单方法就是计算图像差值。也就是说,通过把亮度值相减可以得到变化或者运动;如果没有发生运动,相减的结果就是0;但如果图像中的目标作出的运动,他们的图像像素亮度值就会发生变化,相减结果是一个非0的值

python+openCV利用摄像头实现人员活动检测

4.开始

(1).我们开启摄像头模块还是利用openCV,如下代码即可。我们使用的是笔记本电脑自带的摄像头(树莓派想直接用一个USB摄像头插上而不是用CSI摄像头,这样直接移植代码比较方便)

camera = cv2.VideoCapture(0)

(2).查看一下camera的尺寸,用以下两个函数

width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))

(3).检测轮廓还是需要用灰度图像,不明白的可以看看我以前的文章

gray_pic = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

上一步骤即把图像灰度化

(4).重点说一下这个FPS的设置,我用以下写法,也是参考了一下别人的代码哈=、=

start = time.time()
"""
xxxxx中间一部分代码省略
"""
 seconds = end - start
 if seconds < 1.0 / fps:
 time.sleep(1.0 / fps - seconds)

(5).进行一下高斯滤波模糊处理

这里说一下高斯滤波是一种线性平滑滤波,通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。我理解的就是一个卷积的过程。

听着很麻烦但实现很简单

gray_pic = cv2.GaussianBlur(gray_pic, (21, 21), 0)

注意(21,21)中必须是奇数,否则会出错,想具体了解的话有时间单独写一篇关于高斯的文章

(6).计算两图片的差

img_delta = cv2.absdiff(pre_frame, gray_pic)

(7).滤波,这个代码的意思是把灰度图中33以下的归为0,33以上的点归为255

thresh = cv2.threshold(img_delta, 30, 255, cv2.THRESH_BINARY)[1]

(8).利用形态学的腐蚀与膨胀(上篇文章讲过了,有时间详细说一下,网上资料也很多)

thresh = cv2.dilate(thresh, None, iterations=2)

(9).findContours检测物体的轮廓

image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

(10).在while(1)循环中结束摄像头的调用(按Q结束)

大家都在用这种方法,直接Copy就好啦

if cv2.waitKey(1) & 0xFF == ord('q'):
 break

5.附上源代码

import cv2
import time
# 定义摄像头对象,其参数0表示第一个摄像头
camera = cv2.VideoCapture(0)
# 测试用,查看视频size
width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = width,height
#打印一下分辨率
print(repr(size))
#设置一下帧数和前背景
fps = 5
pre_frame = None
 
while (1):
 start = time.time()
 # 读取视频流
 ret, frame = camera.read()
 # 转灰度图
 gray_pic = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
 if not ret:
 print("打开摄像头失败")
 break
 end = time.time()
 
 cv2.imshow("capture", frame)
 
 # 运动检测部分,看看是不是5FPS
 seconds = end - start
 if seconds < 1.0 / fps:
 time.sleep(1.0 / fps - seconds)
 gray_pic = cv2.resize(gray_pic, (480, 480))
 # 用高斯滤波进行模糊处理
 gray_pic = cv2.GaussianBlur(gray_pic, (21, 21), 0)
 
 # 如果没有背景图像就将当前帧当作背景图片
 if pre_frame is None:
 pre_frame = gray_pic
 else:
 # absdiff把两幅图的差的绝对值输出到另一幅图上面来
 img_delta = cv2.absdiff(pre_frame, gray_pic)
 # threshold阈值函数(原图像应该是灰度图,对像素值进行分类的阈值,当像素值高于(有时是小于)阈值时应该被赋予的新的像素值,阈值方法)
 thresh = cv2.threshold(img_delta, 30, 255, cv2.THRESH_BINARY)[1]
 # 用一下腐蚀与膨胀
 thresh = cv2.dilate(thresh, None, iterations=2)
 # findContours检测物体轮廓(寻找轮廓的图像,轮廓的检索模式,轮廓的近似办法)
 image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 for c in contours:
  # 设置敏感度
  # contourArea计算轮廓面积
  if cv2.contourArea(c) < 1000:
  continue
  else:
  print("有人员活动!!!")
  # 保存图像
  TI = time.strftime('%Y-%m-%d', time.localtime(time.time()))
  cv2.imwrite("D:\\PYthon\\first_j\\" + "JC"+TI+ '.jpg', frame)
  break
 pre_frame = gray_pic
 
 if cv2.waitKey(1) & 0xFF == ord('q'):
 break
 
# release()释放摄像头
camera.release()
# destroyAllWindows()关闭所有图像窗口
cv2.destroyAllWindows()

python+openCV利用摄像头实现人员活动检测

开启后动了一下脸,就可以看到输出啦,并且把照片已经保存了下来

python+openCV利用摄像头实现人员活动检测

效果图在下面,就不暴露帅气的外表了

python+openCV利用摄像头实现人员活动检测

效果还可以,不动的话不会拍照,如果想让他愚钝点可以调节灵敏度

6.结语

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
用Python将mysql数据导出成json的方法
Aug 21 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
浅谈python 中类属性共享的问题
Jul 02 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
pytorch 共享参数的示例
Aug 17 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
Python如何把十进制数转换成ip地址
May 25 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
树莓派实现移动拍照
Jun 22 #Python
树莓派+摄像头实现对移动物体的检测
Jun 22 #Python
Python数据结构与算法(几种排序)小结
Jun 22 #Python
python+opencv实现摄像头调用的方法
Jun 22 #Python
python算法与数据结构之冒泡排序实例详解
Jun 22 #Python
分析运行中的 Python 进程详细解析
Jun 22 #Python
机器学习实战之knn算法pandas
Jun 22 #Python
You might like
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
Js切换功能的简单方法
2010/11/23 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
JS表的模拟方法
2015/02/05 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
python抓取网页图片示例(python爬虫)
2014/04/27 Python
通过C++学习Python
2015/01/20 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
python实现汉诺塔算法
2021/03/01 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
如何在Python对Excel进行读取
2020/06/04 Python
python 下载文件的几种方法汇总
2021/01/06 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
幼儿园中班下学期评语
2014/04/18 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电