首页 > 其他分享 >【OpenCV函数详解之cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)】

【OpenCV函数详解之cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)】

时间:2024-06-03 22:59:35浏览次数:14  
标签:gray p0 old calcOpticalFlowPyrLK cv2 图像 一帧

文章目录

cv2.calcOpticalFlowPyrLK()函数介绍:

cv2.calcOpticalFlowPyrLK() 是 OpenCV 库中用于计算两幅图像之间稀疏光流(Sparse Optical Flow)的方法之一。光流是指图像中物体在不同时间点的位置移动。这个函数通过 Lucas-Kanade 方法来跟踪图像中的关键点(feature points)在后续帧中的位置。

以下是对 cv2.calcOpticalFlowPyrLK() 函数的详细介绍:

函数定义:

calcopticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts, status=None, err=None, winsize=None, maxLevel=None)

需要传入前一帧和当前图像以及前一帧检测到的角点,用于获得光流检测后的角点位置

参数说明:

  1. prevImg: 前一帧的图像(8位单通道图像)。
  2. nextImg: 当前帧的图像(与前一帧同样大小和类型)。
  3. prevPts: 前一帧图像中的特征点(关键点)数组,数据类型为 numpy 数组,形状为 (N, 1, 2),其中 N 是特征点的数量。
  4. nextPts: 输出参数,表示在当前帧图像中计算出的特征点位置。与 prevPts 大小相同。
  5. status: 输出参数,表示每个特征点的跟踪状态。如果某个特征点被成功跟踪,其对应的 status 值为 1,否则为 0。
  6. err: 输出参数,表示每个特征点的错误向量(误差)。在某些情况下,这个参数可能被忽略。
  7. winSize: 搜索窗口的大小,默认值为 (21, 21)。
  8. maxLevel: 金字塔的最大层数,0 表示不使用图像金字塔。默认值为 3。
  9. criteria: 迭代搜索算法的终止条件。通常为 cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT,并设置最大迭代次数和 epsilon。
  10. flags: 操作标志,默认为 0。可以使用的标志包括 cv2.OPTFLOW_USE_INITIAL_FLOW,表示使用初始估计的点位置。
  11. minEigThreshold: 测量是否被视为良好特征点的最小特征值。默认值为 1e-4。

返回值

  1. nextPts: 在当前帧图像中计算出的特征点位置。
  2. status: 跟踪结果的状态数组。
  3. err: 每个特征点的错误向量。

示例代码

以下是一个简单的示例代码,用于在两帧图像之间计算光流:

import cv2
import numpy as np

# 读取前一帧和当前帧图像
prevImg = cv2.imread('frame1.png', cv2.IMREAD_GRAYSCALE)
nextImg = cv2.imread('frame2.png', cv2.IMREAD_GRAYSCALE)

# 使用 Shi-Tomasi 角点检测器找到前一帧图像中的关键点
prevPts = cv2.goodFeaturesToTrack(prevImg, maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)

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

# 计算光流
nextPts, status, err = cv2.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, None, **lk_params)

# 筛选出被成功跟踪的点
good_new = nextPts[status == 1]
good_old = prevPts[status == 1]

# 绘制跟踪结果
for i, (new, old) in enumerate(zip(good_new, good_old)):
    a, b = new.ravel()
    c, d = old.ravel()
    cv2.line(nextImg, (a, b), (c, d), (0, 255, 0), 2)
    cv2.circle(nextImg, (a, b), 5, (0, 255, 0), -1)

# 显示结果图像
cv2.imshow('Optical Flow', nextImg)
cv2.waitKey(0)
cv2.destroyAllWindows()

执行结果:

总结:

cv2.calcOpticalFlowPyrLK() 函数是一个强大的工具,用于在视频处理中跟踪运动物体。通过合理设置参数,可以在各种应用场景中得到稳定的跟踪效果。


p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)解释:

这句代码是OpenCV库中用于计算稀疏光流(Sparse Optical Flow)的,特别是使用了Lucas-Kanade方法结合金字塔(PyrLK)来跟踪特征点。

逐步解释这句代码的含义:

函数:

cv2.calcOpticalFlowPyrLK(): 这是OpenCV中用于计算稀疏光流的函数,特别是使用Lucas-Kanade方法结合金字塔(PyrLK)的方法。

参数:

  • old_gray: 这是一帧灰度图像,代表“旧”或“前一帧”的图像。
  • frame_gray: 这是另一帧灰度图像,代表“新”或“当前帧”的图像。
  • p0: 这是一个二维点数组(通常是整数坐标),表示在old_gray图像中需要跟踪的特征点的初始位置。
  • None: 这是status参数的默认值(或占位符)。当你实际调用此函数时,它通常会返回一个与p0大小相同的数组,其中每个元素都是一个布尔值,指示对应的点是否成功跟踪。
  • lk_params: 这是一个包含Lucas-Kanade光流方法参数的字典。这些参数可能包括窗口大小、最大金字塔级别、迭代次数、终止条件等。

返回值:

  • p1: 这是一个二维点数组,表示在frame_gray图像中成功跟踪的特征点的位置。
  • st: 这是一个与p0大小相同的布尔数组,表示哪些点成功跟踪(True)或失败(False)。
  • err: 这是一个与p0大小相同的数组,表示每个点的错误度量(通常是跟踪的质量或置信度)。

使用:

  1. 通常会先使用某种特征检测器(如Shi-Tomasi角点检测器)在old_gray图像中找到一组点(p0)。
  2. 然后,可以使用cv2.calcOpticalFlowPyrLK来跟踪这些点在frame_gray图像中的位置。
  3. 通过检查st数组,你可以知道哪些点成功跟踪,并可以使用p1数组中的相应位置来更新你的特征点集。
  4. err数组可以用于进一步分析或决定何时应该重新检测特征点(例如,当误差变得太大时)。
    注意:在使用此函数之前,确保你已经将old_gray和frame_gray转换为灰度图像(如果它们不是的话),因为Lucas-Kanade方法是在灰度图像上操作的。

标签:gray,p0,old,calcOpticalFlowPyrLK,cv2,图像,一帧
From: https://blog.csdn.net/2301_77444219/article/details/139426280

相关文章

  • yolov8改进之嵌入Gold层
    #加载模型model=YOLO("yolov8n.yaml")  #从头开始构建新模型model=YOLO("yolov8n.pt")  #加载预训练模型(建议用于训练)#使用模型model.train(data="coco128.yaml",epochs=3)  #训练模型metrics=model.val()  #在验证集上评估模型性能results=model......
  • 翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL
    Whatadrag:DraggingaUniformResourceLocator(URL)andtext-TheOldNewThinghttps://devblogs.microsoft.com/oldnewthing/20080313-00/?p=23123RaymondChen 2008年03月13日 麻烦的拖拽:拖拽统一资源定位符(URL)和文本简要        这篇文章主要讲......
  • 翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL
    Whatadrag:DraggingaUniformResourceLocator(URL)-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080312-00/?p=23133RaymondChen 2008年03月12日麻烦的拖拽:拖拽统一资源定位符(URL)简要本文介绍了如何在Windows程序中实......
  • java8,频繁old gc,通过修改g1回收器之后,效果很好
    原配置:-Xms15360m-Xmx15360m-XX:NewSize=4096m-XX:MaxNewSize=4096m-XX:MetaspaceSize=512m-XX:MaxDirectMemorySize=1024m-XX:+UseG1GC-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/data/logs/skynet-\${DAOKEAPPUK}/\${DAOKEAPPUK}_heapDump.hprof-XX:+UseC......
  • C3P0链学习
    c3P0链学习目录c3P0链学习URLClassLoader远程类加载出网利用条件逆向分析正向分析总结复现漏洞C3P0之JNDI注入出网利用条件发现者视角正向分析漏洞复现C3P0之hex序列化不出网利用条件正向分析漏洞复现C3P0不出网无依赖的利用C3P0是一个开源的JDBC连接池,它实现了数据源......
  • Large Language Models as Data Augmenters for Cold-Start Item Recommendation论文
    LargeLanguageModelsasDataAugmentersforCold-StartItemRecommendation论文阅读笔记Abstract​ LLM的推理和泛化能力可以帮助我们更好地理解用户的偏好和项目特征。我们建议利用LLM作为数据增强器,来弥补在训练过程中对冷启动项目的知识差距。我们使用LLM根据用户历史行......
  • 翻译《The Old New Thing》- Consequences of the scheduling algorithm: Low priorit
    Consequencesoftheschedulingalgorithm:Lowprioritythreadscantake100%CPU-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071220-00/?p=24093 RaymondChen 2007年12月20日调度算法的控制:低优先级线程也可能占用100%的......
  • ColoredBox child 是 Scaffold 颜色失效
    在Flutter中,Scaffold小部件有自己的一组属性来管理其外观,包括背景颜色。当你将Scaffold作为ColoredBox的子小部件时,Scaffold的backgroundColor属性将覆盖ColoredBox的颜色。要解决这个问题,你可以直接设置Scaffold的backgroundColor属性,而不是使用ColoredBox。如......
  • GoldWave专业音频编辑软件
    GoldWave是一款易上手的专业数字音频编辑软件。从最简单的录制和编辑到最复杂的音频处理,恢复,增强和转换,它可以完成所有工作。音频编辑包括剪切、复制、粘贴、Trim和替换、编写。GoldWave强大的音频编辑功能,让您在几秒钟内切片,切块和合并大型音频文件。Mix和Crossfade歌曲一......
  • 翻译《The Old New Thing》- Hotkeys involving the Windows logo key are reserved b
    HotkeysinvolvingtheWindowslogokeyarereservedbythesystem-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071130-00/?p=24333RaymondChen 2007年11月30日Windows徽标键的热键由系统保留        系统保留了......