8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何通过 opencv 识别摄像机视角的视频片段:围绕自身旋转或围绕物体旋转

rechandler 1月前

11 0

我正在尝试构建一个自动化系统,该系统可以识别以下类型的视频片段:摄像机 POV 围绕一个物体旋转(该物体大部分位于画面的中心)

我正在尝试构建一个自动化系统来识别以下类型的视频片段:

  • 摄影机 POV 围绕一个物体旋转(该物体始终位于画面的中心)
  • 摄像机 POV 围绕自身水平旋转
  • 相机 POV 垂直围绕自身旋转

使用 openCV 构建它的最简单方法是什么?显然,视频的中间部分是不相关的 - 即从一种运动过渡到另一种运动。

我正在考虑以下方法:

  • 定义这两种运动类型的模式(如何定义?)。这些可以是 30 秒或几分钟。它需要准确识别哪个是该运动类型的起始帧以及哪个是结束帧(哪种算法最适合?)。
  • 对于每种类型,循环遍历视频的帧并记录相关部分的开始和结束时间戳(可能有多个)
帖子版权声明 1、本帖标题:如何通过 opencv 识别摄像机视角的视频片段:围绕自身旋转或围绕物体旋转
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由rechandler在本站《opencv》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 如果您需要构建 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
    
    
返回
作者最近主题: