打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python-OpenCV 超简单实用运动侦测算法

一、概念

运动侦测,英文翻译为“Motion detection technology”,一般也叫移动检测,常用于无人值守监控录像和自动报警。通过摄像头按照不同帧率采集得到的图像会被CPU按照一定算法进行计算和比较,当画面有变化时,如有人走过,镜头被移动,计算比较结果得出的数字会超过阈值并指示系统能自动作出相应的处理。
—–百度百科

差分算法

差分检测根据当前图像与参考图像的差别分析来判断序列图像中是否有运动的物体。在环境亮度变化不大的情况下,如果对应像素灰度值的差异小于某个阈值,则认为画面静止无运动变化,如果图像区域某处的灰度变化大于某个阈值,则认为这是由于图像中运动 的物体所引起的,然后求出运动目标在图像中的位置。

基于相邻帧差的算法:

将前后两帧图像对应像素点的灰度值相减;
基于背景图像与当前帧差的算法:
将当前帧和背景帧对应像素的灰度值相减;

一、帧差法

1. 帧差法原理

移动侦测即是根据视频每帧或者几帧之间像素的差异,对差异值设置阈值,筛选大于阈值的像素点,做掩模图即可选出视频中存在变化的桢。帧差法较为简单的视频中物体移动侦测,帧差法分为:单帧差、两桢差、和三桢差。随着帧数的增加是防止检测结果的重影。

2. 算法思路

步骤:

  1. 读取视频
  2. 选取两帧
  3. 灰度化
  4. 滤波
  5. 帧间做差
  6. 二值化
  7. 形态学操作

opencv中的absdiff可以用来求两幅灰度图像的差值图像.

3. 代码

# encoding=utf-8import datetimeimport imutilsimport timeimport cv2min_area = 500camera = cv2.VideoCapture(0)# 等待摄像头准备好time.sleep(0.25)# 初始化视频流的第一帧firstFrame = None# 遍历视频的每一帧while True: # 获取帧并初始化occupied/unoccupied文本 (grabbed, frame) = camera.read() text = 'Unoccupied' # 调整该帧的大小,转换为灰阶图像并且对其进行高斯模糊 frame = imutils.resize(frame, width=500) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (21, 21), 0) # 初始化第1帧 if firstFrame is None: firstFrame = gray continue # 差分 frameDelta = cv2.absdiff(firstFrame, gray) thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1] # 形态学操作 膨胀 thresh = cv2.dilate(thresh, None, iterations=2) thresh, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓 for c in contours: # if the contour is too small, ignore it print('area = %f ' % cv2.contourArea(c)) if cv2.contourArea(c) < min_area: continue # compute the bounding box for the contour, draw it on the frame, # and update the text # 计算轮廓的边界框,在当前帧中画出该框 (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) text = 'Occupied' # draw the text and timestamp on the frame # 帧上写文字以及时间戳 cv2.putText(frame, 'Room Status: {}'.format(text), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) cv2.putText(frame, datetime.datetime.now().strftime('%A %d %B %Y %I:%M:%S%p'), (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1) # 显示帧 cv2.imshow('Security Feed', frame) cv2.imshow('Thresh', thresh) cv2.imshow('Frame Delta', frameDelta) key = cv2.waitKey(1) # q键跳出循环 if key == ord('q'): break# 清理资源camera.release()cv2.destroyAllWindows()

运行效果:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【CV】基于阈值处理的图像分割算法!
python进阶—OpenCV之常用图像操作函数说明
二值化处理与边缘检测
自适应阈值二值化算法
图像二值化
[OpenCV]经典霍夫变换原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服