OpenCV CUDA 模块光流计算------稀疏光流算法类SparsePyrLKOpticalFlow

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

OpenCV CUDA 模块中实现的稀疏光流算法类,基于 Lucas-Kanade 方法,并支持图像金字塔结构。适用于特征点跟踪任务(如角点、FAST 特征等)。

创建对象方法

静态函数:create()

static Ptr<cv::cuda::SparsePyrLKOpticalFlow> cv::cuda::SparsePyrLKOpticalFlow::create(cv::Size winSize = cv::Size(21, 21),int maxLevel = 3,int iters = 30,bool useInitialFlow = false
);

参数说明:

参数名类型默认值描述
winSizeSizeSize(21,21)Lucas-Kanade 算法使用的窗口大小(必须为奇数)
maxLevelint3金字塔最大层级数(0 表示不使用金字塔)
itersint30每层金字塔上的最大迭代次数
useInitialFlowboolfalse是否使用初始 flow 输入

主要成员函数

深色版本

函数名返回类型描述
calc()void计算两帧图像之间的稀疏光流
getWinSize()Size获取当前窗口大小
getMaxLevel()int获取金字塔最大层级
getIterations()int获取每层迭代次数
getUseInitialFlow()bool获取是否启用初始 flow 输入
setUseInitialFlow(bool flag)void设置是否启用初始 flow 输入
getStream()Stream&获取当前使用的 CUDA 流
setStream(const Stream& stream)void设置使用的 CUDA 流
collectGarbage()void显式释放内部资源(如显存)

calc() 函数原型

void cv::cuda::SparsePyrLKOpticalFlow::calc(InputArray prevImg,            // 前一帧图像 (灰度图 CV_8UC1)InputArray nextImg,            // 当前帧图像 (灰度图 CV_8UC1)InputArray prevPts,            // 上一帧中要追踪的点集 (CV_32FC2)InputOutputArray nextPts,      // 输出:当前帧中追踪到的点集OutputArray status,            // 输出:每个点是否成功追踪 (uchar)OutputArray err = noArray(),   // 可选输出:误差值Stream& stream = Stream::Null()
);

参数说明:

参数名类型描述
prevImgInputArray前一帧图像(灰度图,CV_8UC1)
nextImgInputArray当前帧图像(灰度图,CV_8UC1)
prevPtsInputArray上一帧的特征点位置(CV_32FC2 格式)
nextPtsInputOutputArray输出:当前帧中对应点的位置(CV_32FC2)
statusOutputArray输出:每个点是否成功追踪(uchar,1 成功,0 失败)
errOutputArray / noArray()可选输出:误差值
streamStream&可选 CUDA 流,默认为 Stream::Null()

注意事项与要求

条件要求
输入图像格式必须为灰度图(CV_8UC1)
关键点格式必须为 CV_32FC2 格式,且是单行矩阵(rows == 1
图像尺寸prevImgnextImg 的尺寸必须相同
实时性支持支持实时处理,适合小数量关键点
替代方案对于稠密光流,请使用 DenseOpticalFlowNvidiaOpticalFlow 系列接口

示例代码

#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudaoptflow.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::cuda;int main()
{// Step 1: 读取两帧图像(灰度图)Mat frame1 = imread( "/media/dingxin/data/study/OpenCV/sources/images/frame1.png", IMREAD_GRAYSCALE );Mat frame2 = imread( "/media/dingxin/data/study/OpenCV/sources/images/frame2.png", IMREAD_GRAYSCALE );if ( frame1.empty() || frame2.empty() ){std::cerr << "无法加载图像" << std::endl;return -1;}// Step 2: 上传到 GPUGpuMat d_frame1, d_frame2;d_frame1.upload( frame1 );d_frame2.upload( frame2 );// Step 3: 检测角点作为追踪起点std::vector< Point2f > corners;goodFeaturesToTrack( frame1, corners, 500, 0.01, 10 );  // 最多检测500个角点// Step 4: 转换为 GPU 可用数组GpuMat d_prevPts;// 构造一行多列的 CV_32FC2 格式 MatMat m_prevPts( 1, corners.size(), CV_32FC2 );for ( size_t i = 0; i < corners.size(); ++i ){m_prevPts.at< cv::Vec2f >( 0, i ) = cv::Vec2f( corners[ i ].x, corners[ i ].y );}d_prevPts.upload( m_prevPts );// Step 5: 创建稀疏光流对象Ptr< cuda::SparsePyrLKOpticalFlow > lk = cuda::SparsePyrLKOpticalFlow::create();// Step 6: 准备输出变量GpuMat d_nextPts;GpuMat d_status;GpuMat d_err;// Step 7: 计算稀疏光流lk->calc( d_frame1, d_frame2, d_prevPts, d_nextPts, d_status, d_err );// Step 8: 下载结果Mat nextPts, status;d_nextPts.download( nextPts );d_status.download( status );// Step 9: 绘制跟踪结果Mat output;cv::cvtColor( frame1, output, COLOR_GRAY2BGR );// 注意:status 和 nextPts 都是单行矩阵,所以使用 (0, i)for ( int i = 0; i < status.cols; ++i ){if ( ( int )status.at< uchar >( 0, i ) == 1 ){Point2f pt1 = corners[ i ];Point2f pt2 = nextPts.at< Point2f >( 0, i );// 确保点在图像范围内if ( pt2.x >= 0 && pt2.y >= 0 && pt2.x < frame1.cols && pt2.y < frame1.rows ){line( output, pt1, pt2, Scalar( 0, 255, 0 ), 1 );circle( output, pt2, 2, Scalar( 0, 0, 255 ), -1 );}}}imshow( "Sparse PyrLK Optical Flow", output );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

免费工具-微软Bing Video Creator

目录 引言 一、揭秘Bing Video Creator 二、轻松上手&#xff1a;三步玩转Bing Video Creator 2.1 获取与访问&#xff1a; 2.2 创作流程&#xff1a; 2.3 提示词撰写技巧——释放AI的想象力&#xff1a; 三、核心特性详解&#xff1a;灵活满足多样化需求 3.1 双重使用模…

MySQL技术内幕1:内容介绍+MySQL编译使用介绍

文章目录 1.整体内容介绍2.下载编译流程2.1 安装编译工具和依赖库2.2 下载编译 3.配置MySQL3.1 数据库初始化3.2 编辑配置文件3.3 启动停止MySQL3.4 登录并修改密码 1.整体内容介绍 MySQL技术系列文章将从MySQL下载编译&#xff0c;使用到MySQL各组件使用原理源码分析&#xf…

MySQL 事务详解

MySQL 事务详解 一、事务是什么&#xff1f;为什么需要事务&#xff1f; 二、事务的四大特性&#xff08;ACID&#xff09;举例说明&#xff1a;转账操作 三、MySQL 中事务的支持四、事务分类&#xff1a;隐式 vs 显式1. 隐式事务&#xff08;自动提交&#xff09;2. 显式事务&…

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…

利用coze工作流制作一个自动生成PPT的智能体

在Coze平台中&#xff0c;通过工作流实现PPT自动化生成是一个高效且灵活的解决方案&#xff0c;尤其适合需要快速产出标准化演示文稿的场景。以下是基于Coze工作流制作PPT的核心逻辑与操作建议&#xff1a; 理论流程 一、核心流程设计 需求输入与解析 用户输入&#xff1a;主…

vue3 按钮级别权限控制

在Vue 3中实现按钮级别的权限控制&#xff0c;可以通过多种方式实现。这里我将介绍几种常见的方法&#xff1a; 方法1&#xff1a;使用Vue 3的Composition API 在Vue 3中&#xff0c;你可以使用Composition API来创建一个可复用的逻辑来处理权限控制。 创建权限控制逻辑 首…

spa首屏加载慢怎样解决

SPA&#xff08;Single Page Application&#xff0c;单页应用&#xff09;首屏加载慢是一个常见问题&#xff0c;主要原因通常是首次加载需要拉取体积较大的 JavaScript 文件、样式表、初始化数据等。以下是一些常见的 优化策略&#xff0c;可以帮助你 提升首屏加载速度&#…

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…

NTT印地赛车:数字孪生技术重构赛事体验范式,驱动观众参与度革命

引言&#xff1a;数字孪生技术赋能体育赛事&#xff0c;开启沉浸式观赛新纪元 在传统体育赛事观赛模式遭遇体验天花板之际&#xff0c;NTT与印地赛车系列赛&#xff08;NTT INDYCAR SERIES&#xff09;的深度合作&#xff0c;通过数字孪生&#xff08;Digital Twin&#xff09…

解构与重构:PLM 系统如何从管理工具进化为创新操作系统?

在智能汽车、工业物联网等新兴领域的冲击下&#xff0c;传统产品生命周期管理&#xff08;PLM&#xff09;系统正在经历前所未有的范式转换。当某头部车企因 ECU 软件与硬件模具版本失配导致 10 万辆智能电车召回&#xff0c;损失高达 6 亿美元时&#xff0c;这场危机不仅暴露了…

【Ubuntu 16.04 (Xenial)​​】安装docker及容器详细教程

Ubuntu 16.04 安装docker详细教程 一、docker安装1.1 前期准备1.2 使用 Docker 官方安装脚本安装&#xff08;推荐&#xff09; 查看ubuntu版本&#xff1a;lsb_release -a 这里我的系统是 ​​Ubuntu 16.04 (Xenial)​​&#xff0c;在 ​​Ubuntu 16.04 (Xenial)​​ 上安装…

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…

MySQL:InnoDB架构(内存架构篇)

目录 0.前置知识 0.1二级索引的概念 二级索引查询原理 1.整体架构 1.1为什么innoDB的架构会分为两个部分? 2.内存架构 2.1BufferPool 2.2ChangeBuffer 唯一性检查不是实时性会出现的问题? ChangeBuffer的优势 2.3Adaptive Hash Index 2.4LogBuffer 0.前置知识 0.…

鹰盾加密器“一机一码”技术全维度剖析:从底层实现到生态防护体系

“一机一码”加密技术的深度解析与实现路径 引言 在数字内容版权保护和软件授权管理领域&#xff0c;“一机一码”技术作为一种重要的安全防护手段&#xff0c;能够有效防止授权码滥用和非法传播。它通过建立设备与授权码的唯一对应关系&#xff0c;确保每份授权仅在特定设备…

Android 中使用 OkHttp 创建多个 Client

在 Android 开发中&#xff0c;有时我们需要创建多个 OkHttpClient 实例来满足不同的网络请求需求。以下是创建和管理多个 OkHttpClient 的方法&#xff1a; 基本创建方式 // 创建默认的 OkHttpClient val defaultClient OkHttpClient()// 创建带有自定义配置的 Client val …

C++中的跳转语句

C中的跳转语句包括break、continue和goto&#xff0c;它们用于改变程序的正常执行流程。下面分别介绍它们的作用、使用场景和注意事项&#xff1a; 1. break 作用&#xff1a; • 立即终止当前所在的循环&#xff08;for、while、do while&#xff09;或switch语句&#xff…

AI在网络安全领域的应用现状和实践

当前&#xff0c;人工智能技术已深度融入网络安全产品&#xff0c;推动传统防御模式向智能化、自适应方向加速演进。各安全厂商通过机器学习、深度学习与知识图谱等技术的融合应用&#xff0c;提高安全产品在威胁检测、攻击溯源、风险评估等场景的能力跃迁&#xff0c;突破传统…

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…

Spark 之 DataFrame 开发

foreachPartition val data = spark.sparkContext.parallelize(1 to 100)// 使用 foreachPartition 批量处理分区 data.foreachPartition {partitionIterator =