【python】四帧差法实现运动目标检测
四帧差法是一种运动目标检测技术,它通过比较连续四帧图像之间的差异来检测运动物体。这种方法可以在一定的程度上提高检测的准确性。
目录
1 方案
2 实践
① 代码
② 效果图
1 方案
具体的步骤如下:
① 读取视频流:使用cv2.VideoCapture()读取视频文件。
② 读取初始的三帧图像:连续读取三帧图像并将其转换为灰度图。
③ 读取新帧:循环中,读取新的第四帧并将其转换为灰度图,保持队列中有四帧。
④ 计算帧间差:使用cv2.absdiff计算连续帧之间的差值。
⑤ 差值叠加:将三个帧间差值相加,以增强运动区域的对比度。
⑥ 阈值处理:使用cv2.threshold将叠加后的差值图像转换为二值图像。
⑦ 形态学闭运算:使用cv2.morphologyEx进行闭运算,去除噪声,填充运动物体的轮廓。
⑧ 显示结果:使用cv2.imshow显示检测到的运动区域和当前帧。
⑨ 更新帧:将当前帧更新为下一帧,以便在循环中持续检测运动。
⑩ 退出循环:按’q’键退出程序。
四帧差法通过增加参考帧的数量,可以更准确地检测运动物体,尤其在复杂背景下表现更佳。与三帧差法相比,这种方法也会增加一些计算量。
2 实践
① 代码
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)
ret, frame3 = cap.read()
frame3_gray = cv2.cvtColor(frame3, cv2.COLOR_BGR2GRAY)
while True:
# 读取下一帧
ret, frame4 = cap.read()
if not ret:
break
frame4_gray = cv2.cvtColor(frame4, cv2.COLOR_BGR2GRAY)
# 计算帧间差
diff1 = cv2.absdiff(frame1_gray, frame2_gray)
diff2 = cv2.absdiff(frame2_gray, frame3_gray)
diff3 = cv2.absdiff(frame3_gray, frame4_gray)
# 将三帧差相加
diff_total = cv2.add(diff1, diff2)
diff_total = cv2.add(diff_total, diff3)
# 应用阈值处理
_, thresh = cv2.threshold(diff_total, 30, 255, cv2.THRESH_BINARY)
# 形态学闭运算,去除噪声
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 显示结果
cv2.imshow('Video', frame4)
cv2.imshow('Motion Detection', closing)
# 更新帧
frame1_gray = frame2_gray
frame2_gray = frame3_gray
frame3_gray = frame4_gray
# 按'q'退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
OD("test.mp4")
pass
② 效果图
至此,本文分享的内容就结束啦。