OpenCV CUDA模块中用于稠密光流计算的 TV-L1(Dual TV-L1)算法类cv::cuda::OpticalFlowDual_TVL1

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

算法描述

cv::cuda::OpticalFlowDual_TVL1类是基于变分优化方法的稠密光流算法实现(Dual TV-L1 光流模型),在 GPU 上加速运行。适用于精度要求较高、但对性能要求不极端的应用场景。

所属模块和头文件

  • 模块:opencv_cudaoptflow
  • 头文件:
 #include <opencv2/cudaoptflow.hpp>

功能概述

特性描述
稠密光流计算计算图像帧之间的像素级运动矢量(X 和 Y 分量)
GPU 加速使用 CUDA 在 NVIDIA GPU 上进行加速
高精度基于 TV-L1 变分优化模型,适用于需要高精度光流的场景
支持参数调节支持多个超参数调整以平衡速度与质量

创建对象方法

Ptr<cv::cuda::OpticalFlowDual_TVL1> tvl1 = cv::cuda::OpticalFlowDual_TVL1::create();

你也可以使用以下函数设置默认参数:

Ptr<cv::cuda::OpticalFlowDual_TVL1> tvl1 = cv::cuda::OpticalFlowDual_TVL1::create(double tau = 0.25,double lambda = 0.15,double theta = 0.3,int nscales = 5,int warps = 5,double epsilon = 0.01,int iterations = 300,bool useInitialFlow = false);

主要成员函数

函数名描述
calc(…)计算两帧图像之间的光流
get/setTau()获取/设置梯度下降步长 τ
get/setLambda()获取/设置光流平滑约束系数 λ
get/setTheta()获取/设置对偶变量更新权重 θ
get/setNumScales()获取/设置金字塔层数
get/setWarpingsNumber()获取/设置每层 warp 次数
get/setEpsilon()获取/设置收敛阈值 ε
get/setIterations()获取/设置每次 warp 的迭代次数
get/setUseInitialFlow()是否使用初始 flow 输入(如前一帧结果)

calc() 函数原型

void calc(InputArray I0,              // 第一帧图像(灰度图)InputArray I1,              // 第二帧图像(灰度图)InputOutputArray flowX,     // 输出 X 分量InputOutputArray flowY,     // 输出 Y 分量Stream& stream = Stream::Null()
);

参数说明:

参数类型描述
I0, I1InputArray输入的两帧图像(必须为 CV_8UC1 灰度图)
flowX, flowYInputOutputArray输出的 X/Y 方向光流分量(CV_32FC1)
streamStream&可选 CUDA 流,默认为 Stream::Null()

示例代码

#include <opencv2/opencv.hpp>
#include <opencv2/cudaoptflow.hpp>using namespace cv;
using namespace cv::cuda;// 自定义绘制函数
void drawOpticalFlow(const Mat& flow, Mat& dst, int step = 16);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: 创建 Dual TVL1 光流对象Ptr<cuda::OpticalFlowDual_TVL1> tvl1 = cuda::OpticalFlowDual_TVL1::create();// Step 4: 设置参数(OpenCV 4.9 支持的参数)tvl1->setNumIterations(100);       // 总迭代次数tvl1->setLambda(0.15);             // 平滑项权重tvl1->setUseInitialFlow(false);    // 是否使用初始 flow// Step 5: 准备输出光流数据(注意:输出为 CV_32FC2 格式)GpuMat flow;  // 注意:不再是 flowX + flowY 分开// Step 6: 执行光流计算(注意参数顺序)tvl1->calc(d_frame1, d_frame2, flow, Stream::Null());// Step 7: 下载结果到 CPUMat host_flow;flow.download(host_flow);// Step 8: 绘制光流矢量图Mat flowImg;drawOpticalFlow(host_flow, flowImg);imshow("frame1", frame1);imshow("frame2", frame2);imshow("CUDA Dual TV-L1 Flow", flowImg);waitKey(0);return 0;
}// 自定义绘制函数
void drawOpticalFlow(const Mat& flow, Mat& dst, int step) {dst = Mat::zeros(flow.size(), CV_8UC3);for (int y = 0; y < flow.rows; y += step) {for (int x = 0; x < flow.cols; x += step) {Point2f f = flow.at<Point2f>(y, x);line(dst, Point(x, y), Point(cvRound(x + f.x * 5), cvRound(y + f.y * 5)),Scalar(0, 255, 0));circle(dst, Point(cvRound(x + f.x * 5), cvRound(y + f.y * 5)), 1,Scalar(0, 255, 0), -1);}}
}

运行结果

在这里插入图片描述

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

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

相关文章

ThreadPoolTaskExecutor+CompletableFuture实现多线程异步数据同步和自定义线程池监控和动态调整实现

前言 ThreadPoolTaskExecutor是Spring框架提供的一个线程池实现&#xff0c;它是对Java标准库中ThreadPoolExecutor的封装&#xff0c;提供了更便捷的配置和集成方式&#xff0c;特别适合在Spring环境中使用。相关线程池概念见线程&线程池相关 CompletableFuture 是 Java…

一篇文章理解js闭包和作用于原理

一、js闭包的作用原理 JS闭包是指内部函数访问外部函数变量的机制&#xff0c;常用于数据封装和模块化。典型应用包括创建私有变量、解决循环中的异步问题、实现函数柯里化等。案例分析展示了闭包在计数器、防抖函数等场景的使用&#xff0c;同时揭示了可能的内存泄漏风险。正…

GUI丝滑教程-python tinker

在 Tkinter GUI 应用中&#xff0c;线程可以帮助你在后台执行长时间运行的任务&#xff0c;而不阻塞界面响应。下面是一些技巧&#xff0c;帮助你在使用线程时避免 Tkinter 界面卡顿的问题。 为什么 Tkinter 界面会卡顿&#xff1f; Tkinter 使用 主线程 来处理 UI 更新&…

第一部分-数据通信网络基础

目录 一、什么是网络通信&#xff1f; 二、网络通信设备的基本识别 1.双绞线 2.集线器&#xff08;物理层设备&#xff09; 3.中继器&#xff08;物理层设备&#xff09; 4.接入交换机 5.汇聚交换机 6.核心交换机 7.路由器 8.无线路由器 9.光猫 一、什么是网络通信&#xff1f;…

windows电脑解决笔记本搜索不到wifi问题

windows笔记本电脑明明打开了wifi功能&#xff0c;却搜索不到wifi&#xff0c;此问题可能是网络适配器被禁用的原因导致&#xff0c;通过以下方法也许能解决&#xff0c;无需重启电脑 1、右键点击网络或wifi图标&#xff0c;打开界面”网络和internet“ 2、选择”高级网络设置…

C# 界面检测显示器移除并在可用显示器上显示

C# 检测显示器被移除&#xff0c;将界面在当前可用的显示器上显示&#xff0c;避免程序在任务栏点击无响应。 using System; using System.Linq; using System.Windows.Forms;public class MonitorWatcher : IDisposable {private readonly Form _targetForm;private Screen …

JAVA实战开源项目:青年公寓服务平台 (Vue+SpringBoot) 附源码

本文项目编号 T 233 &#xff0c;文末自助获取源码 \color{red}{T233&#xff0c;文末自助获取源码} T233&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

阿里云服务状态监控:实时掌握云服务健康状况

前言 在云计算时代,企业和开发者越来越依赖云服务提供商的基础设施和服务。当我们的应用部署在云上,服务的可用性和稳定性就与云服务提供商息息相关。一旦云服务出现故障或维护,可能会对我们的业务造成直接影响。因此,实时了解云服务的运行状态变得尤为重要。阿里云作为国…

使用VSCode开发FastAPI指南

1概述 FastAPI 是一个现代的高性能 Web 框架&#xff0c;用于使用 Python 构建 API。它旨在让开发者轻松快速高效地构建 API&#xff0c;同时提供 API 的自动验证、序列化和文档记录等功能&#xff0c;使其成为构建 Web 服务和微服务的热门选择。 在这个 FastAPI 教程中&#…

2025年硬件实习/秋招面试准备

前言 暑期即将到来&#xff0c;有很多研一研二以及大三大四的同学准备硬件类&#xff08;硬件研发、嵌入式硬件、layout、电源设计、射频、硬件测试、工艺、FAE&#xff09;的实习或秋招。鉴于此&#xff0c;总结一下网友们秋招、实习中的硬件高频考点&#xff0c;并分析他们是…

VSCode - Trae 插件关闭弹出框代码补全

Trae 插件关闭弹出框代码补全 弹出框代码补全与非弹出框代码补全 如下是弹出框代码补全 如下是非弹出框代码补全 关闭 / 启用弹出框代码补全 点击 【管理】&#xff08;小齿轮&#xff09; -> 点击 【设置】 取消勾选&#xff08;如果需要启用&#xff0c;则勾选即可&…

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(三)

DSL官方地址&#xff1a; DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0…

我们来学mysql -- keepalive主从高可用

keepalive主从高可用 简明扼要安装KP场景“高可用”配置主keepalived.conf从keepalived.confmysql_check.sh 高可用验证KP运行情况通过vip连接mysqlvip连接上创建数据库关闭主库所在服务器的KPvip连接上再次创建数据库 结尾 简明扼要 搭建mysql的主从八股文如是&#xff1a;主…

Compose笔记(二十六)--DatePicker

这一节主要了解一下Compose中的DatePicker,DatePicker是一个用于选择日期的组件&#xff0c;它提供了直观的界面让用户可以通过日历视图或直接输入来选择年、月、日。我们在开发中时常会用到日期选择器&#xff0c;简单总结如下: API: DatePickerDialog onDismissRequest&…

【靶场】upload-labs-文件上传漏洞闯关

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.第一关1.保存html页面2.修改页面html3.访问修改后的本地html文件4.上传php文件5.访问上传的php2.第二关1.抓上传包修改文件类型2.上传成功3.第三关1.phtml php3会被解析为php原理2.上传成功4…

基于 Transformer RoBERTa的情感分类任务实践总结之四——PGM、EMA

整合了以下五大核心技术&#xff1a;R-Drop、PGM 对抗训练、EMA、标签平滑、CosineAnnealing 学习率调度。 1. R-Drop&#xff08;Regularized Dropout&#xff09; 原理&#xff1a;同一个样本做两次前向传播&#xff08;同 dropout mask&#xff09;&#xff0c;计算两次输…

录制mp4 rospy

ros 预览摄像头 #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2# 初始化 bridge bridge CvBridge()def image_callback(msg):# 将ROS图像消息转换为OpenCV图像cv_image bridge.imgmsg_to_cv2(msg, desir…

超简单部署离线语音合成TTS和语音识别

一篇文章讲清楚超简单 离线语音合成TTS 和 离线语音识别 系统部署 本文只介绍两个轻量级的 语音合成用piper, 语音识别用vosk 部署简单,效果勉强 语音合成 推荐 piper (其他没用过) 安装 linux下安装 pip install piper-tts下载模型(63M) 中文模型下载 zh_CN-huayan-medi…

【算力网】

一、算力网-DNS 1.1、核心架构设计 1.1.1 设计框架 基于SRv6的智能DNS算法设计框架&#xff0c;结合IPv6路由可编程性、动态路径优化及业务感知能力&#xff0c;实现网络性能与用户体验的双重提升&#xff1a;​ ​SRv6-DNS融合架构​ ​控制平面​&#xff1a; DNS服务器集…

shell分析nginx日志的指令

shell指令 查看有多少个IP访问&#xff1a; awk {print $1} log_file|sort|uniq|wc -l 查看某一个页面被访问的次数&#xff1a; grep "/index.php" log_file | wc -l 查看每一个IP访问了多少个页面&#xff1a; awk {S[$1]} END {for (a in S) print a,S[a]} …