通过计算视频中每帧图像之间的差,或者每帧图像与某个固定背景的差。该方法适用于背景相对静止(色彩、视角)的视频。
基本步骤
- 平滑当前帧
- 计算与背景帧的差
- 二值化、适当的形态学处理
- 寻找并适当的轮廓
- 在当前帧中标识轮廓区域区域
- 将当前帧设置为背景帧
def run(self):
self._window_manager.create_window()
background = None
diff = None
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 4))
kernel = np.ones((5, 5), np.uint8)
while self._window_manager.is_window_created:
self._capture_manager.enter_frame()
frame = self._capture_manager.frame
if frame is not None:
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray_frame = cv2.GaussianBlur(gray_frame, (9, 9), 0)
if background is None:
background = gray_frame
else:
diff_1 = cv2.absdiff(background, gray_frame)
background = gray_frame
diff_2 = cv2.threshold(diff_1, 10, 255, cv2.THRESH_BINARY)[1]
diff = cv2.dilate(diff_2, kernel, iterations=2)
image, cnts, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
if cv2.contourArea(c) < 8000:
continue
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
if diff is not None:
self._capture_manager.frame = diff
else:
self._capture_manager.frame = background
self._capture_manager.frame = frame
self._capture_manager.exit_frame()
self._window_manager.process_events()
其余代码请参考OpenCV+Python简易视频处理框架
![](https://img.haomeiwen.com/i11864412/71291d4cd0e34acc.gif)
网友评论