OpenCV 之 实现基于Lucas-Kanade算法的光流追踪

引言

在计算机视觉中,光流是指物体、场景或摄像机之间的相对运动造成的像素变化。光流估计是计算机视觉中的一个基础课题,广泛应用于许多领域,比如自动驾驶汽车、机器人导航、手势识别等。OpenCV是一个开源的计算机视觉库,提供了许多功能强大的算法,其中包括光流算法。本文将介绍如何使用Python结合OpenCV来实现基于Lucas-Kanade算法的光流追踪,并展示如何在视频中追踪特征点的运动轨迹。

实现步骤

准备工作

首先,确保已经安装了numpyopencv-python库。如果尚未安装,可以使用pip命令进行安装:

pip install numpy opencv-python

代码解析

下面是一个使用Lucas-Kanade算法追踪视频中特征点并绘制轨迹的例子。我们将逐步解释代码的每一部分。

import numpy as np
import cv2# 打开视频文件
cap = cv2.VideoCapture(r'picture_video\test.avi')# 随机生成颜色,用于绘制轨迹
color = np.random.randint(0, 255, (100, 3))# 读取视频的第一帧
ret, old_frame = cap.read()# 将第一帧转换为灰度图像
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)# 定义特征点检测参数
feature_params = dict(maxCorners=100,  # 最大角点数量qualityLevel=0.3,  # 角点质量的阈值minDistance=7)     # 最小距离,用于分散角点# 检测初始帧的特征点
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)# 创建一个与当前帧大小相同的全零掩模,用于绘制轨迹
mask = np.zeros_like(old_frame)# 定义Lucas-Kanade光流参数
lk_params = dict(winSize=(15, 15),  # 窗口大小maxLevel=2)         # 金字塔层数# 主循环,处理视频的每一帧
while True:# 读取下一帧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)# 选择好的点(状态为1的点)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()  # 获得旧点的坐标a, b, c, d = int(a), int(b), int(c), int(d)  # 转换为整数# 在掩模上绘制线段,连接新点和旧点mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)# 显示掩模cv2.imshow('mask', mask)# 将掩模添加到当前帧上,生成最终图像img = cv2.add(frame, mask)# 显示结果图像cv2.imshow('frame', img)# 等待150ms,检测是否按下了Esc键(键码为27)k = cv2.waitKey(150) & 0xffif k == 27:  # 按下Esc键,退出循环break# 更新旧灰度图和旧特征点old_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)  # 重新整理特征点为适合下次计算的形状# 释放资源
cv2.destroyAllWindows()
cap.release()

代码解释

  1. 导入必要的库:导入numpy用于数值运算,导入cv2模块用于图像处理。
  2. 打开视频文件:使用cv2.VideoCapture来打开指定路径下的视频文件。
  3. 初始化颜色:随机生成一系列颜色,以便后续绘制轨迹。
  4. 读取第一帧并转换为灰度图:读取视频的第一帧,并将其转换成灰度图,因为光流算法通常在灰度图上进行。
  5. 特征点检测:使用cv2.goodFeaturesToTrack来检测特征点。
  6. 初始化掩模:创建一个与原图像同样大小的全零矩阵,作为绘制轨迹的画布。
  7. 定义光流参数:设置Lucas-Kanade算法所需的参数。
  8. 主循环:读取每一帧视频,计算光流向量,并绘制轨迹。
  9. 显示结果:在每一帧上叠加轨迹后显示图像。
  10. 更新状态:在每次循环结束时更新旧的灰度图像和特征点位置。
  11. 清理资源:最后,释放视频文件和关闭所有OpenCV窗口。

结论

通过以上代码,我们可以实现基于Lucas-Kanade算法的光流追踪,并在视频中可视化特征点的移动轨迹。这种方法不仅可以帮助我们理解视频中物体的运动情况,而且对于开发需要感知环境动态变化的应用来说也是非常有用的。希望这篇博客能对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:计算机网络概述 —— 描述计算机网络的参数

文章目录 数据量性能指标速率带宽数据传输速率 吞吐量时延分析时延问题 时延带宽积往返时间利用率丢包率丢包的情况 抖动可用性可靠性安全性 计算机网络是现代信息社会的基础设施,其性能和可靠性对各类应用至关重要。为了理解和优化计算机网络,我们需要深…

vue后台管理系统从0到1(1)

文章目录 vue后台管理系统从0到1(1)nvm 下载安装1.卸载nodejs环境2.安装nvm 安装nrm vue后台管理系统从0到1(1) 第一节主要是先安装我们的工具nvm nodejs版本管理工具,和nrm镜像管理工具 nvm 下载安装 nvm是一款管理…

重学SpringBoot3-集成Redis(一)之基础功能

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(一)之基础功能 1. 项目初始化2. 配置 Redis3. 配置 Redis 序列化4. 操作 Redis 工具类5. 编写 REST 控制器6. 测试 AP…

论文翻译 | Language Models are Few-Shot Learners 语言模型是少样本学习者(上)

摘要 最近的工作表明,通过在大规模文本语料库上进行预训练,然后在特定任务上进行微调,许多自然语言处理(NLP)任务和基准测试都取得了显著的提升。尽管这种方法在架构上通常是任务无关的,但它仍然需要成千上…

JavaWeb三大组件之Servlet

1. Servlet 一、Servlet介绍 1、概念 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成…

【Python】JSON操作中的高效小窍门

JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在各种应用场景中扮演着重要角色。Python 中处理 JSON 数据非常便捷,主要通过内置的 json 模块来实现。 本文将详细介绍如何使用 Python 进行 JSON 数据的操作&am…

AI与物理学的交汇:Hinton与Hopfield获诺贝尔物理学奖

诺贝尔物理学奖颁给了AI!机器学习先驱Hinton与Hopfield联手获奖,出乎所有人的意料。 今年的诺贝尔物理学奖颁给了机器学习领域的两位先驱,杰弗里辛顿(Geoffrey Hinton)和约翰霍普菲尔德(John Hopfield&…

CSS计数器

CSS 中的计数器类似于变量,可以实现简单的计数功能,并将结果显示在页面上,在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性: counter-reset:创建或者重置计数器;counter-increment&#xf…

【软件部署安装】OpenOffice转换PDF字体乱码

现象与原因分析 执行fc-list查看系统字体 经分析发现,linux默认不带中文字体,因此打开我们本地的windows系统的TTF、TTC字体安装到centos机器上。 安装字体 将Windows的路径: C:\Windows\Fonts 的中文字体,如扩展名为 TTC 与TT…

力扣题31~40

题31(中等): 分析: 其实这题题目比较难懂,题目还是挺简单的 我们可以从后面末尾开始,如果前一个大于后面的,说明后面不用动,如果小于,那就找仅仅大于它的数字放前面&…

Chromium 关闭 Google Chrome 后继续运行后台应用功能分析c++

此功能允许关闭 Google Chrome 后继续运行后台,控制此功能的开关是 // Set to true if background mode is enabled on this browser. //更改此值可以修改默认开启关闭 inline constexpr char kBackgroundModeEnabled[] "background_mode.enabled"; …

案例分享—国外优秀UI设计作品赏析

深色UI界面的优点众多,首先体现在视觉舒适度上。深色背景能减少屏幕高亮面积,降低眼部压力,尤其在夜间或光线不足的环境下,深色模式能显著缓解眼睛疲劳,提供更舒适的使用体验。 深色UI界面在设计上更具高端感和优雅氛围…

用Raspberry Pi Imager重装树莓派系统

今天删东西的时候,无意中把系统文件给remove了,结果树莓派无法正常启动,只能重新安装。 用DiskGenius工具将SD卡彻底清空,并将boot分区和文件分区合并为一,之后再对这个新分区进行了格式化。接下来就是烧录镜像了。以…

自动化测试 | 窗口截图

driver.get_screenshot_as_file 是 Selenium WebDriver 的一个方法,它允许你将当前浏览器窗口(或标签页)的截图保存为文件。这个方法对于自动化测试中的截图验证非常有用,因为它可以帮助你捕获测试执行过程中的页面状态。 以下是…

布隆过滤器(Bloom Filter)详解

一、引言 在处理大量数据的场景中,我们经常会遇到判断一个元素是否在某个集合中的问题。传统的方法可能是使用 HashMap 等集合将数据保存起来,然后进行比较确定,但在元素很多的情况下,这种方式会非常浪费空间,检索速度…

Map的实现类:TreeMap

1.存储结构:红黑树 2.实现了SortedMap接口(是Map的子接口),可以对key自动排序。 3.实例代码:Student类和Demo03 如果出现类转换异常 参考【TreeSet(红黑树)】 package com.map;import java…

使用Git生成SSH密钥教程(附Git常用命令)

一、为什么使用SSH? 使用 Git 的 SSH(安全外壳协议)主要有以下几个原因:1. 安全性:SSH 是一种加密的网络协议,用于在网络中安全地运行网络服务。使用 SSH,所有传输的数据都会被加密&#xff0c…

Lory: 推进大型语言模型训练的新篇章

人工智能咨询培训老师叶梓 转载标明出处 随着模型规模的增长,如何有效训练并利用这些模型成为了一个挑战。陈丹琦团队一项新的研究提出了一种创新的预训练方法——Lory,旨在解决大模型在混合专家(MoE)架构中的可微分性和计算效率…

主机加固的关键要素:服务器防病毒

在数字化浪潮中,网络安全已成为企业不可忽视的一环。尤其是安全运维人员,他们肩负着保护企业数据不受侵害的重任。MCK主机加固解决方案,正是为了应对这一挑战而生。 网络安全的严峻现实 不久前,一家知名企业因勒索病毒攻击而被迫…

2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)

第二步链接: 2024 kali虚拟机安装教程,分两大步骤,图文讲解(2)-CSDN博客 准备工作 1.kali的iso镜像文件 2.VMware Workstation Pro 虚拟机软件 正式开始 1.创建新的虚拟机,勾选自定义(高级…