++++三帧差法++++ 是一种常用的运动目标检测方法,它通过比较连续三帧图像之间的差异来检测运动物体。这种方法尤其适用于背景变化较小的场景。
目录
[1 方案](#1 方案)
[2 实践](#2 实践)
[① 代码](#① 代码)
[② 效果图](#② 效果图)
1 方案
具体步骤如下:
① ++++读取视频流++++:使用cv2.VideoCapture()读取视频文件。
② ++++灰度++++ ++++化++++:将彩色图像转换为灰度图,简化后续计算。
③ ++++帧间差分++++:计算连续三帧之间的差分,absdiff函数计算两个灰度图像的绝对差值。然后,将两帧差相加。
④ ++++阈值处理++++:使用threshold函数将差分图像转换为二值图像,突出运动区域。
⑤ ++++形态学操作++++:应用闭运算(morphologyEx)去除小的噪声点。
⑥ ++++显示结果++++:使用imshow显示检测到的运动区域和当前帧。
⑦ ++++更新帧++++:将当前帧更新为下一帧,以便在循环中持续检测运动目标。
⑧ ++++退出循环++++:按'q'键退出程序。
需要注意的是,三帧差法仅适用于背景相对静止 的场景。如果背景的变化较大,则需要更复杂的方法(背景减除或自适应阈值技术)。
2 实践
① 代码
python
import cv2
import numpy as np
def OD(video_path):
# 初始化摄像头
cap = cv2.VideoCapture(video_path)
# 读取第一帧作为初始帧
ret, frame1 = cap.read()
frame1_gray = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
# 读取第二帧
ret, frame2 = cap.read()
frame2_gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
while True:
# 读取第三帧
ret, frame3 = cap.read()
if not ret:
break
frame3_gray = cv2.cvtColor(frame3, cv2.COLOR_BGR2GRAY)
# 计算帧间差
diff1 = cv2.absdiff(frame1_gray, frame2_gray)
diff2 = cv2.absdiff(frame2_gray, frame3_gray)
# 将两帧差相加
diff = cv2.add(diff1, diff2)
# 应用阈值来提取运动区域
_, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
# 使用形态学操作去除噪声
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 显示结果
cv2.imshow("video", frame3)
cv2.imshow('Motion Detection', closing)
# 更新帧
frame1_gray = frame2_gray
frame2_gray = frame3_gray
# 按'q'退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
OD("test.mp4")
pass
② 效果图
至此,本文分享的内容就结束啦。