我正在尝试构建一个自动化系统,该系统可以识别以下类型的视频片段:摄像机 POV 围绕一个物体旋转(该物体大部分位于画面的中心)
我正在尝试构建一个自动化系统来识别以下类型的视频片段:
使用 openCV 构建它的最简单方法是什么?显然,视频的中间部分是不相关的 - 即从一种运动过渡到另一种运动。
我正在考虑以下方法:
如果您需要构建 3D 世界视图,那么您将需要使用运动结构,即像 opensfm 这样的库。
如果您主要关注检测视频(例如无人机视频或航空摄影)中的运动,那么您可能正在寻找光流。
伪代码
import cv2
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
good_new = p1[st == 1]
good_old = p0[st == 1]
motion = classify_motion(good_new, good_old)
def classify_motion(good_new, good_old):
# Classify the motion based on patterns in motion vectors
motion_vectors = []
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
motion_vectors.append(((a - c), (b - d)))
avg_vector = np.mean(motion_vectors, axis=0)
movement_magnitude = np.linalg.norm(avg_vector)
# Heuristics for determining motion type
if movement_magnitude < 1: # Small movement, likely Pan
return "Pan"
elif np.std([v[0] for v in motion_vectors]) < 2 and np.std([v[1] for v in motion_vectors]) > 5:
return "Dolly" # Mostly lateral movement
elif np.std([v[0] for v in motion_vectors]) > 5 and np.std([v[1] for v in motion_vectors]) < 2:
return "Flyover" # Mostly vertical movement