OpenCV中的光流估计方法详解

文章目录

    • 一、引言
    • 二、核心算法原理
      • 1. 光流法基本概念
      • 2. 算法实现步骤
    • 三、代码实现详解
      • 1. 初始化设置
      • 2. 特征点检测
      • 3. 光流计算与轨迹绘制
    • 四、实际应用效果
    • 五、优化方向
    • 六、结语

一、引言

在计算机视觉领域,运动目标跟踪是一个重要的研究方向,广泛应用于视频监控、自动驾驶、人机交互等场景。本文将介绍如何使用OpenCV中的Lucas-Kanade光流法实现简单的运动目标轨迹跟踪,并详细解析代码实现。

二、核心算法原理

1. 光流法基本概念

光流(Optical Flow)是图像中物体运动造成的视觉"流动",描述了像素点在连续帧之间的运动模式。Lucas-Kanade算法是一种经典的稀疏光流算法,它基于以下三个假设:

  • 亮度恒定(同一特征点的亮度不随时间变化)
  • 时间持续性(运动随时间缓慢变化)
  • 空间一致性(邻近点有相似运动)

2. 算法实现步骤

  1. 特征点检测:使用Shi-Tomasi角点检测
  2. 光流计算:金字塔Lucas-Kanade方法
  3. 轨迹绘制:连接连续帧中的特征点

三、代码实现详解

1. 初始化设置

import numpy as np
import cv2# 视频读取和参数初始化
cap = cv2.VideoCapture('test.avi')
color = np.random.randint(0,255,(100,3))  # 随机颜色用于轨迹绘制

2. 特征点检测

# 读取第一帧并转换为灰度图
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)# Shi-Tomasi角点检测参数
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)
  • 使用角点检测方法找到特征点
goodFeaturesToTrack(image,maxCorners,qualityLevel,minDistance,corners=None,mask=None,blockSize=None)
  • image:输入单通道图像。用灰度图
  • maxCorners:设定最大的角点个数,是最有可能的角点数,如果这个参数不大于0,那么表示没有角点数的限制。
  • qualityLevel:图像角点的最小可接受参数,质量测量值乘以这个参数就是最小特征值,小于这个数的会被抛弃。
  • minDistance:角点之间最小的欧氏距离
  • mask:检测区域,如果图像不是空的,它指定检测角的区域。
  • 返回所有角点坐标位置:corners

3. 光流计算与轨迹绘制

# LK光流参数
lk_params = dict(winSize=(15,15), maxLevel=2)while True: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().astype(int)c, d = old.ravel().astype(int)mask = cv2.line(mask, (a,b), (c,d), color[i].tolist(), 2)img = cv2.add(frame, mask)cv2.imshow('frame', img)# 更新前一帧数据old_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)

计算光流,获取新的特征点位置和状态

calcOpticalFlowPyrLK(prevImg,nextImg,prevPts,nextPts,status=None,err=None,winSize=None,maxLevel=None,criteria=None,flags=None,minEigThreshold=None)
  • prevImg:前一帧图像
  • nextImg:当前帧图像
  • prevPts:前一帧图像中特征点坐标位置
  • nextPts:当前帧图像中特征点坐标,可以为None
  • winSize:搜索窗口的大小
  • maxLevel:金字塔层数
  • criteria:停止迭代的准则
  • 返回值
  • nextPts:在当前帧中估计出的特征点坐标
  • status:一个与prevPts一样大小的状态向量,用于表示特征点是否被成功跟踪到。
  • err:一个与prevPts一样大小的误差向量,用于表示估计误差

四、实际应用效果

运行程序后,可以看到视频中检测到的特征点及其运动轨迹。不同颜色的线条代表不同特征点的运动路径,直观展示了物体的运动情况。

显示效果如下:左边是一段有很多人在走动的视频,右边就是根据人物运动的轨迹画出的轨迹图。
在这里插入图片描述

五、优化方向

  1. 特征点选择优化:可以尝试其他特征检测算法如SIFT、SURF等
  2. 运动模型改进:引入卡尔曼滤波等预测算法提高跟踪稳定性
  3. 遮挡处理:添加特征点重新检测机制应对遮挡情况
  4. 性能优化:使用多线程处理提高实时性

六、结语

本文实现了一个基于OpenCV的简单运动目标跟踪系统,展示了光流法的基本应用。虽然实现相对简单,但包含了目标跟踪的核心思想。读者可以在此基础上进行扩展,开发更复杂的跟踪系统。

我们定能不负所托 不负所望!!!🚀🚀🚀

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

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

相关文章

零基础入门MySQL:10分钟搞定数据库基本操作

📚 一、MySQL是什么? MySQL 是一个关系型数据库管理系统(简单理解:用“表格”存储数据的仓库)。 就像Excel表格一样,数据按行和列整齐存放,方便快速查找和管理! 为什么要学MySQL&a…

LeetCode 3335.字符串转换后的长度 I:I先递推

【LetMeFly】3335.字符串转换后的长度 I:I先递推 力扣题目链接:https://leetcode.cn/problems/total-characters-in-string-after-transformations-i/ 给你一个字符串 s 和一个整数 t,表示要执行的 转换 次数。每次 转换 需要根据以下规则替…

Linux 系统如何挂载U盘

一、问题描述 Linux系统不像Windows系统有图形化界面,对于机房服务器安装的Linux尤其如此,那么有时候需要拷贝U盘或者光盘的文件到Linux系统中去,与 Windows 系统自动为 U 盘分配盘符不同,Linux 系统需要手动将 U 盘挂载到指定目…

Qt进阶开发:QTcpServer的详解

文章目录 一、QTcpServer 简介二、常用成员函数的使用三、信号函数的使用四、虚函数的使用五、连接多客户端-服务端示例一、QTcpServer 简介 QTcpServer 是 Qt 网络模块中的一个核心类,用于实现 基于 TCP 协议的服务端(Server),它负责监听端口、接收客户端连接请求,并通过…

大项目k8s集群有多大规模,多少节点,有多少pod

1. 实际参与过生产级 K8s 集群 回答示例: 目前我负责的 K8s 集群规模为 300 个物理节点,分布在 3 个可用区(AZ),采用多控制平面高可用架构。集群日常运行约 12,000 个 Pod,资源利用率保持在 65%-75%&#…

是 OpenCV 的 CUDA 模块中用于在 GPU 上对图像或矩阵进行转置操作函数cv::cuda::transpose

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::transpose 是 OpenCV 的 CUDA 模块中的一个函数,用于在 GPU 上对图像或矩阵进行转置操作(Transpose&#xff0…

使用 goaccess 分析 nginx 访问日志

介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…

Google LLM prompt engineering(谷歌提示词工程指南)

文章目录 基本概念AI输出配置:调整AI的回答方式输出长度温度(Temperature)Top-K和Top-P 提示技术:让AI更好地理解你零样本提示(Zero-shot)少样本提示(Few-shot)系统提示(…

简单介绍Qt的属性子系统

深入理解Qt的属性系统 ​ 笔者最近正在大规模的开发Qt的项目和工程,这里笔者需要指出的是,这个玩意在最常规的Qt开发中是相对比较少用的,笔者也只是在Qt的QPropertyAnimation需要动画感知笔者设置的一个属性的时候方才知道这个东西的。因此&…

NestJS 框架深度解析

框架功能分析 NestJS 是一个基于 Node.js 的渐进式框架,专为构建高效、可扩展的服务器端应用程序而设计。其核心理念结合了 面向对象编程(OOP)、函数式编程(FP) 和 函数式响应式编程(FRP)&…

PostgreSQL技术大讲堂 - 第89讲:重讲数据库完全恢复

PostgreSQL技术大讲堂 - 第89讲,主题:重讲数据库完全恢复 时间:2025年05月10日19:30 欢迎持续关注CUUG PostgreSQL技术大讲堂。

ubuntu部署supabase

安装supabse https://supabase.com/docs/guides/local-development/cli/getting-started?queryGroupsplatform&platformlinux brew install supabase/tap/supabase supabase init supabase start需要使用brewuser进行安装: brew安装参考链接: ht…

基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

python 上海新闻爬虫, 东方网 + 澎湃新闻

1. 起因, 目的: 继续做新闻爬虫。我之前写过。此文先记录2个新闻来源。后面打算进行过滤,比如只选出某一个类型新闻。 2. 先看效果 过滤出某种类型的新闻,然后生成 html 页面,而且,自动打开这个页面。 比如科技犯罪…

使用bitNet架构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、配置二、报错总结 前言 大型语言模型(LLM)面临的挑战:高能耗、高内存需求、部署门槛高。 微软提出 BitNet 架构&#x…

笔试强训(十七)

文章目录 活动安排题解代码 哈夫曼编码题解代码 奇数位丢弃题解代码 活动安排 题目链接 题解 1. 区间贪心 排序 2. 如果有重叠部分,每次选择右端点较小的,可以尽可能多的选择区间个数,如果没有重叠部分,选择下一个区间的右端…

数据库数据清洗、预处理与质量监控、 数据质量的核心概念

数据库数据清洗、预处理与质量监控、 数据质量的核心概念 准确性 (Accuracy) 准确性指数据正确反映其所描述的实体或事件真实状况的程度。准确的数据应当与现实世界中的实际情况一致。 一致性 (Consistency) 一致性指数据在不同表、系统或时间点之间保持逻辑上一致的程度。…

Docker组件详解:核心技术与架构分析

Docker详解:核心技术与架构分析 Docker作为一种容器化技术,已经彻底改变了软件的开发、交付和部署方式。要充分理解和利用Docker的强大功能,我们需要深入了解其核心组件以及它们如何协同工作。本文将详细介绍Docker的主要组件、架构设计以及…

【言语】刷题3

front:刷题2 题干 超限效应介绍冰桶挑战要避免超限效应 B明星的作用只是病痛挑战的一个因素,把握程度才是重点,不是强化弱化明星作用,排除 A虽没有超限效应,但是唯一的点出“冰桶效应”的选项,“作秀之嫌…

【fastadmin开发实战】在前端页面中使用bootstraptable以及表格中实现文件上传

先看效果: 1、前端页面中引入了表格 2、表格中实现文件上传 3、增加截止时间页面 难点在哪呢? 1、这是前端页面,并不支持直接使用btn-dialog的类属性实现弹窗; 2、前端页面一般绑定了layout模板,如何实现某个页面不…