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

server/2024/12/22 20:17:15/

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

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

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

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

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

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

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

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

  1. Dense Optical Flow (DIS) 示例代码:
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:breaknext = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)# 计算光流flow = dis.calc(prvs, next, None)# 显示光流# 这里可以根据需要对光流进行可视化# 例如绘制光流向量或者光流场# ...# 更新前一帧prvs = nextif cv2.waitKey(30) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()
  1. Lucas-Kanade (LK) 光流算法示例代码:
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:breakframe_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) & 0xffif k == 27:break# 更新下一帧的特征点old_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)cv2.destroyAllWindows()
cap.release()

http://www.ppmy.cn/server/42177.html

相关文章

MySQL的行级锁

📝个人主页:五敷有你 🔥系列专栏:面经 ⛺️稳中求进,晒太阳 行级锁(索引项加锁来实现的) 行级锁,每次所住对应的行数据。锁定粒度最小,发生锁冲突的概率最低&…

grafana10.x报错 Failed to upgrade legacy queries Datasource x was not found

问题 grafana 从6.x升级到10.x后,导入json文件后报错,数据源x查询不到,grafana不显示数据; Templating Failed to upgrade legacy queries Datasource x was not found解决方法 可能grafana升级后数据源找不到,在面板…

uac驱动之const修饰的变量和const修饰的指针

const int*p // p所指向的空间是常量 不可修改 ,但p可以修改 int*const p // p所指向的空间是可以修改 ,p不可以修改 #include <stdio.h> #include <string.h>struct usb_string {char id;const char *s; };enum {STR_ASSOC,STR_AC_IF,STR_USB_OUT_IT,STR_USB_O…

svg 元素 getBoundingClientRect() 数值为 0

问题 在页面在刷新时&#xff0c;想要立即获取页面中 svg 元素的宽高&#xff0c;做进一步的计算。发现通过 getBoundingClientRect 获取会有一定几率获取值为 0。 解决方案 监听 svg 元素的 load 事件&#xff0c;在回调中再获取。 svgElem.addEventListener("load&…

IT革新狂潮:引领未来的技术趋势

方向一&#xff1a;技术革新与行业应用 当前现状&#xff1a; 量子计算&#xff1a;量子计算的研究正在加速&#xff0c;尽管目前仍处于初级阶段&#xff0c;但其在药物研发、加密技术和材料科学等领域的应用潜力已被广泛认可。 虚拟现实&#xff08;VR&#xff09;与增强现实…

openFeign 调用后 返回 出现 application/json 错误

项目场景&#xff1a; 远程调用时返回json格式错误 项目场景&#xff1a;从分页插件式改换为原生分页的时候 通过openFeign调用时发现了问题 问题描述 不需要openFeign 调用的时候 返回的数据和格式是对 通过openFeign 调用后返回 出现 application/json 错误 &#xff1a; …

16.投影矩阵,最小二乘

文章目录 1. 投影矩阵1.1 投影矩阵P1.2 投影向量 1. 投影矩阵 1.1 投影矩阵P 根据上节知识&#xff0c;我们知道当我们在解 A X b AXb AXb的时候&#xff0c;发现当向量b不在矩阵A的列空间的时候&#xff0c;我们希望的是通过投影&#xff0c;将向量b投影到矩阵A的列空间中&…

机器人SCI期刊,中科院3区,收稿范围广泛!

一、期刊名称 Journal of Intelligent & Robotic Systems 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.3 中科院分区&#xff1a;3区 出版方式&#xff1a;开放出版 版面费&#xff1a;$2990 三、期刊征稿范围…