【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()
相关推荐
Elastic 中国社区官方博客几秒前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
_.Switch10 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
XiaoLiuLB29 分钟前
ChatGPT Canvas:交互式对话编辑器
人工智能·自然语言处理·chatgpt·编辑器·aigc
Hoper.J29 分钟前
PyTorch 模型保存与加载的三种常用方式
人工智能·pytorch·python
菜就多练_082832 分钟前
《深度学习》OpenCV 摄像头OCR 过程及案例解析
人工智能·深度学习·opencv·ocr
达柳斯·绍达华·宁1 小时前
CNN中的平移不变性和平移等变性
人工智能·神经网络·cnn
技术无疆2 小时前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
xuehaishijue2 小时前
红外画面空中目标检测系统源码分享
人工智能·目标检测·计算机视觉
羊小猪~~2 小时前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
浊酒南街2 小时前
吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.7-2.8
人工智能·深度学习·神经网络