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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84628.shtml
英文地址,請注明出處:http://en.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]} …