opencv python 多帧降噪算法_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()

运行效果:

9ef288e6618b2a98c121866d49d05aa1.png
c01f7de8e43d8975ec63e5cb62772a37.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值