【CV】opencv调用DIS/LK等计算光流,前一帧和当前帧写反了有什么影响?

当在计算光流时,将前一帧和当前帧输入反了,会导致一系列问题。

在计算光流时,通常是将前一帧作为模板,根据当前帧计算光流。因为光流是描述相邻帧之间像素移动的一种方法,它通过比较两帧之间的像素强度或特征点的移动来计算物体的运动情况。

在计算光流时,常用的方法之一是利用Lucas-Kanade光流算法,该算法假设在一个局部区域内,像素的运动是基本相似的。因此,它通过比较当前帧与前一帧之间的像素差异来估计光流向量。

此外,在计算光流时通常使用多尺度图像金字塔来处理不同尺度上的运动。多尺度图像金字塔包含了同一图像的不同分辨率版本,通过在不同尺度上计算光流,可以更好地捕捉到不同尺度下的运动信息,提高光流估计的准确性和鲁棒性。多尺度图像金字塔是基于当前帧计算的 。在计算光流时,首先会对当前帧进行多尺度处理,生成多个尺度的图像金字塔。然后,针对每个尺度的图像金字塔,利用前一帧与当前帧之间的像素差异来估计光流向量。这样做的目的是为了在不同尺度下更全面地捕捉到图像中物体的运动信息,从而提高光流估计的准确性和鲁棒性。如果写反了,多尺度图像金字塔不一样,搜索比对模板也不一样,结果会不一样,总的说来有以下几个方面影响

错误的运动估计:Lucas-Kanade光流算法假设相邻帧之间的像素运动是基本相似的,因此它通过比较两帧之间的像素差异来估计运动。如果反转了帧的顺序,算法会尝试在错误的方向上寻找运动,导致错误的运动估计。

不稳定的结果:由于算法期望输入的帧顺序是正确的,因此反转帧的顺序可能导致算法在不同场景下表现不一致。这可能会导致光流向量的异常或不稳定的结果,因为算法会试图适应错误的输入。

算法性能下降:Lucas-Kanade算法基于一系列假设和约束来进行光流计算,其中之一是相邻帧之间的像素运动是相似的。如果这些假设被违反,算法内部的一些计算步骤可能无法正确执行,导致性能下降。

本文最后给两个光流计算示例

  1. Dense Optical Flow (DIS) 示例代码:
python 复制代码
import cv2

# 读取视频
cap = cv2.VideoCapture('input_video.mp4')

# 创建DIS对象
dis = cv2.DISOpticalFlow_create(cv2.DISOPTICAL_FLOW_PRESET_ULTRAFAST)

# 读取第一帧
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)

# 读取剩余帧并计算光流
while(1):
    ret, frame2 = cap.read()
    if not ret:
        break
    next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)

    # 计算光流
    flow = dis.calc(prvs, next, None)

    # 显示光流
    # 这里可以根据需要对光流进行可视化
    # 例如绘制光流向量或者光流场
    # ...

    # 更新前一帧
    prvs = next

    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
  1. Lucas-Kanade (LK) 光流算法示例代码:
python 复制代码
import cv2
import numpy as np

# 读取视频
cap = cv2.VideoCapture('input_video.mp4')

# 设置LK光流参数
lk_params = dict(winSize=(15, 15),
                 maxLevel=2,
                 criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

# 读取第一帧
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)

# 选择一些特征点作为跟踪点
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)

# 创建一个颜色用于绘制跟踪点
color = np.random.randint(0, 255, (100, 3))

# 开始追踪特征点
while(1):
    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]

    # 绘制轨迹
    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()
        c, d = old.ravel()
        frame = cv2.circle(frame, (a, b), 5, color[i].tolist(), -1)
        frame = cv2.line(frame, (a, b), (c, d), color[i].tolist(), 2)

    # 显示结果
    cv2.imshow('frame', frame)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

    # 更新下一帧的特征点
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1, 1, 2)

cv2.destroyAllWindows()
cap.release()
相关推荐
智驱力人工智能7 分钟前
智慧零售管理中的客流统计与属性分析
人工智能·算法·边缘计算·零售·智慧零售·聚众识别·人员计数
workflower25 分钟前
以光量子为例,详解量子获取方式
数据仓库·人工智能·软件工程·需求分析·量子计算·软件需求
壹氿29 分钟前
Supersonic 新一代AI数据分析平台
人工智能·数据挖掘·数据分析
张较瘦_35 分钟前
[论文阅读] 人工智能 | 搜索增强LLMs的用户偏好与性能分析
论文阅读·人工智能
我不是小upper1 小时前
SVM超详细原理总结
人工智能·机器学习·支持向量机
Yxh181377845541 小时前
抖去推--短视频矩阵系统源码开发
人工智能·python·矩阵
取酒鱼食--【余九】1 小时前
rl_sar实现sim2real的整体思路
人工智能·笔记·算法·rl_sar
一勺汤2 小时前
YOLO12 改进|融入 Mamba 架构:插入视觉状态空间模块 VSS Block 的硬核升级
yolo·计算机视觉·mamba·yolov12·yolo12·yolo12该机·yolo12 mamba
Jamence2 小时前
多模态大语言模型arxiv论文略读(111)
论文阅读·人工智能·语言模型·自然语言处理·论文笔记