python-opencv三帧差法代码
时间: 2023-10-09 10:15:23 浏览: 206
以下是使用Python和OpenCV实现三帧差法的代码示例:
```python
import cv2
# 初始化摄像头或读取视频文件
cap = cv2.VideoCapture(0)
# 读取前三帧,用于初始化背景
ret, frame1 = cap.read()
ret, frame2 = cap.read()
ret, frame3 = cap.read()
# 循环读取视频流
while True:
# 读取当前帧
ret, frame4 = cap.read()
# 计算当前帧与前两帧的差值
diff1 = cv2.absdiff(frame2, frame1)
diff2 = cv2.absdiff(frame3, frame2)
# 计算两个差值的加权平均值
diff = cv2.addWeighted(diff1, 0.5, diff2, 0.5, 0)
# 对差值图像进行阈值化处理
thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
# 对阈值图像进行腐蚀和膨胀操作,去除噪声并填补空洞
thresh = cv2.erode(thresh, None, iterations=2)
thresh = cv2.dilate(thresh, None, iterations=2)
# 在原始图像中标记出运动物体
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
if cv2.contourArea(contour) < 1000:
continue
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame4, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 更新前两帧
frame1 = frame2
frame2 = frame3
frame3 = frame4
# 显示结果
cv2.imshow("Motion Detection", frame4)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
```
这段代码会打开计算机上的默认摄像头,并在摄像头中检测运动物体。如果要读取视频文件,只需将`cap`的初始化代码更改为:`cap = cv2.VideoCapture('video.mp4')`,其中`video.mp4`是要读取的视频文件名。
阅读全文