在机器学习中计算机视觉作为最基础的功能一直被频繁使用。本文将简单介绍如何检测视频中的运动行为。

计算机视觉的核心是两个视频帧之间的运动检测。它按照以下步骤执行此任务:

  1. 视频被分段为帧,(将每个帧视为一个图像)。
  2. 两个图像/帧(A和B)连续拍摄。
  3. 将图像A和B转换为灰度。
  4. 计算这两个灰度图像之间的差异,并将其分配给图像C。
  5. 如果在A和B帧之间检测到显著差异,则可以认为发生了一些运动。
  6. 因此,每当视频中的帧改变时,循环函数将产生新的图像C。

使用计算机视觉的运动检测

下面是如何通过OpenCV完成运动检测的简单示例。

导入open cv并捕捉视频源:

import cv2# Read the video file / sourcecap = cv2.VideoCapture(0)

捕捉第1帧和第2帧并将它们存储在resp. variables:

# Capture the 1st & 2nd frames and store them in resp. variables:ret1, frame1 = cap.read()ret2, frame2 = cap.read()

循环捕捉帧:

# Loop the capture of frames:while True: # Convert the frame1 & frame2 into gray scale to calculate differences: frame1_gray = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) frame2_gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) # Apply the Gaussian blur onto the gray scale frames # Kernel size is 21*21 which applies a stronger level of blurring: frame1_blur = cv2.GaussianBlur(frame1_gray, (21, 21), 0) frame2_blur = cv2.GaussianBlur(frame2_gray, (21, 21), 0) # Calculate the difference between the two frames: frames_diff = cv2.absdiff(frame1_blur, frame2_blur) # Display the difference in an open window: cv2.imshow("Motion Captured:", frames_diff) # Repeat the same for the upcoming frames in the video: frame1 = frame2 ret, frame2 = cap.read() if not ret: break k = cv2.waitKey(10) if k == ord('q'): break

查看所有帧后关闭窗口:

cv2.destroyAllWindows()

全部代码组合后我们保存为detect_difference_in_frames.py

运行:

  1. 使用终端:Python detect_difference_in_frames.py
  2. 使用PyCharm:右键单击,然后选择Run detect_difference_in_frames.py

如果一切正确,你应该可以看到你的网络摄像头被打开了,当你移动你的头部时,它会突出显示灰色框架与检测你的动作之间的差异。