OPenCV CUDA模塊光流------高效地執行光流估計的類BroxOpticalFlow

  • 操作系統:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 編程語言:C++11

算法描述

cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模塊中實現Brox光流算法的類。該類用于在 GPU 上高效地計算兩幀圖像之間的稠密光流(Dense Optical Flow)。

什么是 Brox 光流?

Brox 光流算法是由 Thomas Brox 等人在 2004 年提出的一種基于變分法的稠密光流估計方法,它結合了:

  • 亮度一致性約束(Brightness Constancy Constraint)
  • 運動平滑性約束(Smoothness Constraint)
  • 梯度一致性約束(Gradient Constancy Constraint)

這個算法在準確性和魯棒性方面表現良好,尤其適用于小到中等運動的場景。

cv::cuda::BroxOpticalFlow 類概述

屬性描述
頭文件<opencv2/cudaoptflow.hpp>
命名空間cv::cuda
繼承自cv::cuda::DenseOpticalFlow
用途計算兩個圖像幀之間的稠密光流(每個像素都有一個運動向量)
GPU 加速支持 CUDA GPU 加速

創建與初始化

創建對象

cv::Ptr<cv::cuda::BroxOpticalFlow> brox = cv::cuda::BroxOpticalFlow::create
(float alpha,float gamma,float scale_factor,int inner_iterations,int outer_iterations,int solver_iterations
);
參數說明:
參數名類型含義
alphafloat控制光流平滑程度的正則化參數(越大越平滑)
gammafloat控制梯度一致性的權重
scale_factorfloat圖像金字塔縮放因子(通常為 0.5 表示每層縮小一半)
inner_iterationsint內部迭代次數(求解線性系統)
outer_iterationsint外部迭代次數(優化整體光流場)
solver_iterationsint求解器每次迭代的次數(Jacobi 迭代次數)

使用流程

  1. 準備輸入圖像(必須是灰度圖)
cv::Mat frame1_gray, frame2_gray;
cv::cvtColor(frame1, frame1_gray, cv::COLOR_BGR2GRAY);
cv::cvtColor(frame2, frame2_gray, cv::COLOR_BGR2GRAY);
  1. 轉換為浮點格式并歸一化([0, 1] 區間)
cv::Mat frame1_32f, frame2_32f;
frame1_gray.convertTo(frame1_32f, CV_32F, 1.0 / 255.0);
frame2_gray.convertTo(frame2_32f, CV_32F, 1.0 / 255.0);
  1. 上傳圖像到 GPU
cv::cuda::GpuMat d_frame1, d_frame2;
d_frame1.upload(frame1_32f);
d_frame2.upload(frame2_32f);
  1. 初始化 BroxOpticalFlow 對象
cv::Ptr<cv::cuda::BroxOpticalFlow> brox = cv::cuda::BroxOpticalFlow::create(0.197f,   // alpha50.0f,    // gamma0.8f,     // scale_factor10,       // inner_iterations77,       // outer_iterations10        // solver_iterations
);
  1. 創建輸出矩陣(類型為 CV_32FC2)
cv::cuda::GpuMat d_flow;  // 輸出光流,每個像素是一個 (dx, dy) 向量
  1. 執行光流計算
brox->calc(d_frame1, d_frame2, d_flow);
  1. 分離 flow_x 和 flow_y(可選)
std::vector<cv::cuda::GpuMat> flow_parts(2);
cv::split(d_flow, flow_parts);  // flow_parts[0] = dx, flow_parts[1] = dy
  1. 下載結果到 CPU(顯示或保存用)
cv::Mat host_flowx, host_flowy;
flow_parts[0].download(host_flowx);
flow_parts[1].download(host_flowy);

代碼示例

#include <opencv2/cudaimgproc.hpp>  // for split
#include <opencv2/cudaoptflow.hpp>  // for BroxOpticalFlow
#include <opencv2/opencv.hpp>       // core OpenCVusing namespace cv;
using namespace cv::cuda;int main()
{// Step 1: 加載圖像std::string path1 = "/media/dingxin/data/study/OpenCV/sources/images/frame1.png";std::string path2 = "/media/dingxin/data/study/OpenCV/sources/images/frame2.png";Mat frame1 = imread(path1, IMREAD_GRAYSCALE);Mat frame2 = imread(path2, IMREAD_GRAYSCALE);if (frame1.empty() || frame2.empty()){std::cerr << "無法加載圖像!路徑:" << path1 << " 或 " << path2 << std::endl;return -1;}// Step 2: 轉換為浮點格式 CV_32FC1 并歸一化到 [0,1]Mat frame1_32f, frame2_32f;frame1.convertTo(frame1_32f, CV_32F, 1.0 / 255.0);frame2.convertTo(frame2_32f, CV_32F, 1.0 / 255.0);// Step 3: 上傳到 GPUGpuMat d_frame1, d_frame2;d_frame1.upload(frame1_32f);d_frame2.upload(frame2_32f);// Step 4: 創建 BroxOpticalFlow 對象Ptr<BroxOpticalFlow> brox = BroxOpticalFlow::create();// Step 5: 創建輸出矩陣(CV_32FC2 類型)GpuMat d_flow;// Step 6: 執行光流計算brox->calc(d_frame1, d_frame2, d_flow);// Step 7: 下載光流結果到CPUMat host_flow;d_flow.download(host_flow);  // 先下載到CPU// Step 8: 分離 flow_x 和 flow_y (在CPU上進行)std::vector<Mat> flow_parts(2);split(host_flow, flow_parts);  // 現在使用的是CPU上的cv::splitMat host_flowx = flow_parts[0];Mat host_flowy = flow_parts[1];// Step 9: 歸一化顯示Mat flowx_show, flowy_show;normalize(host_flowx, flowx_show, 0, 1, NORM_MINMAX, CV_32F);normalize(host_flowy, flowy_show, 0, 1, NORM_MINMAX, CV_32F);imshow("Flow X", flowx_show);imshow("Flow Y", flowy_show);// Step 10: 合成彩色光流圖(HSV 表示方向和強度)Mat mag, ang;cartToPolar(host_flowx, host_flowy, mag, ang, true);  // 計算 magnitude & angleMat hsv_channels[3];hsv_channels[0] = ang;                              // Hue 表示方向hsv_channels[1] = Mat::ones(ang.size(), CV_32F);    // Saturation 固定最大hsv_channels[2] = mag;                              // Value 表示運動強度Mat hsv_merged, bgr_out;merge(hsv_channels, 3, hsv_merged);                    // 合并通道hsv_merged.convertTo(hsv_merged, CV_8U, 255);          // 轉換為 0~255cv::cvtColor(hsv_merged, bgr_out, cv::COLOR_HSV2BGR);  // 顯式使用 CPU 版本imshow("Optical Flow Color Map", bgr_out);waitKey(0);  // 等待按鍵關閉窗口return 0;
}

運行結果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85988.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視覺分析在人員行為屬性檢測中的應用

基于視覺分析的人員行為屬性檢測方案 一、背景與需求分析 在工業生產、建筑施工、公共安全等領域&#xff0c;人員行為屬性的合規性檢測是保障安全生產的關鍵環節。例如&#xff0c;工地工人未佩戴安全帽、廚房人員未佩戴手套、作業現場人員使用手機等行為&#xff0c;均可能…

Linux--進程的程序替換

問題導入&#xff1a; 前面我們知道了&#xff0c;fork之后&#xff0c;子進程會繼承父進程的代碼和“數據”&#xff08;寫實拷貝&#xff09;。 那么如果我們需要子進程完全去完成一個自己的程序怎么辦呢&#xff1f; 進程的程序替換來完成這個功能&#xff01; 1.替換原理…

場景題-3

如何實現一個消息隊列 拆解分析主流的幾種消息隊列 1、基本架構 生產者Producer、消費者Consumer、Broker&#xff1a;生產者發送消息&#xff0c;消費者接受消息&#xff0c;Broker是服務端&#xff0c;處理消息的存儲、備份、刪除和消費關系的維護。 主題和分區&#xff…

vue2 項目中 npm run dev 運行98% after emitting CopyPlugin 卡死

今天在運行項目時&#xff0c;發現如下問題&#xff1a; 開始以為是node_modules依賴的問題&#xff0c;于是重新 npm install&#xff0c;重啟項目后還是未解決。 在網上找了一圈發現有人說是 require引入圖片地址沒有寫。在我的項目中排查沒有這個問題&#xff0c;最后發現某…

73 LV的使用(XFS文件系統)

四 LV的使用 先創建一個LV01 lvcreate -L 10G lv01 datavg Logical volume "lv01" created. 將創建出來的LV01進行格式化 mkfs.xxx LV的名稱(絕對路徑) 絕對路徑的組成:/dev/你創建VG的名字/LV的名字 mkfs.xfs /dev/datavg/lv01 掛載你的LV…

mybatis中判斷等于字符串的條件怎么寫

mybatis中判斷等于字符串的條件怎么寫_mybatis 等于字符串-CSDN博客 因為mybatis映射文件&#xff0c;是使用的ognl表達式&#xff0c;ognl是java語言&#xff08;強類型語言&#xff09;&#xff0c;會把‘X’解析成字符&#xff0c;而不是字符串。 所以比較字符串相等使用是…

C語言實現絕對值差值函數

在C語言中&#xff0c;可以編寫一個函數來計算兩個數的差值的絕對值。以下是一個簡單的實現&#xff1a; #include <stdio.h> #include <stdlib.h> // 用于abs函數&#xff08;如果需要&#xff09; // 方法1&#xff1a;使用標準庫函數 int absoluteDifference1…

Three.js中AR實現詳解并詳細介紹基于圖像標記模式AR生成的詳細步驟

文檔地址 Three.js中AR實現詳解 以下是Three.js中實現AR功能的詳細解析&#xff0c;涵蓋技術原理、實現步驟、核心組件及優化策略&#xff1a; &#x1f9e9; 一、技術基礎 AR.js框架的核心作用 AR.js是Three.js實現AR的基石&#xff0c;提供以下核心能力&#xff1a; 多模…

Vue3.5 企業級管理系統實戰(二十三):權限指令

在實際應用場景中&#xff0c;常常需要依據用戶角色對按鈕的操作權限實施控制。實現這一控制主要有兩種方式&#xff1a;一種是借助前端指令基于角色進行權限管控&#xff0c;另一種是通過后臺返回對應的權限屬性來實現精細化控制。本文聚焦于前端權限指令展開探討。 1 權限指…

軟考 系統架構設計師系列知識點之雜項集萃(81)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;80&#xff09; 第145題 商業智能是企業對商業數據的搜集、管理和分析的系統過程&#xff0c;主要技術包括&#xff08;&#xff09;。 A. 數據倉庫、聯機分析和數據挖掘 B. 數據采集、數據清洗…

深入淺出Java ParallelStream:高效并行利器還是隱藏的陷阱?

在Java 8帶來的眾多革新中&#xff0c;Stream API徹底改變了我們對集合操作的方式。而其中最引人注目的特性之一便是parallelStream——它承諾只需簡單調用一個方法&#xff0c;就能讓數據處理任務自動并行化&#xff0c;充分利用多核CPU的優勢。但在美好承諾的背后&#xff0c…

SQL Transactions(事務)、隔離機制

目錄 Why Transactions? Example: Bad Interaction Transactions ACID Transactions COMMIT ROLLBACK How the Transaction Log Works How Data Is Stored Example: Interacting Processes Interleaving of Statements Example: Strange Interleaving Fixing the…

第R9周:阿爾茨海默病診斷(優化特征選擇版)

文章目錄 1. 導入數據2. 數據處理2.1 患病占比2.2 相關性分析2.3 年齡與患病探究 3. 特征選擇4. 構建數據集4.1 數據集劃分與標準化4.2 構建加載 5. 構建模型6. 模型訓練6.1 構建訓練函數6.2 構建測試函數6.3 設置超參數 7. 模型訓練8. 模型評估8.1 結果圖 8.2 混淆矩陣9. 總結…

OpenLayers 分屏對比(地圖聯動)

注&#xff1a;當前使用的是 ol 5.3.0 版本&#xff0c;天地圖使用的key請到天地圖官網申請&#xff0c;并替換為自己的key 地圖分屏對比在WebGIS開發中是很常見的功能&#xff0c;和卷簾圖層不一樣的是&#xff0c;分屏對比是在各個地圖中添加相同或者不同的圖層進行對比查看。…

【大模型】大模型數據訓練格式

1. SFT&#xff08;有監督微調&#xff09; 1.1 數據格式 JSONL&#xff08;每行一個 JSON 對象&#xff09;最為流行&#xff1b;也可用 CSV&#xff0f;TSV&#xff0c;但 JSONL 更靈活。字段設計 prompt&#xff1a;用戶輸入或任務指令&#xff08;通常以“系統指令&#…

[論文閱讀] 人工智能 | 利用負信號蒸餾:用REDI框架提升LLM推理能力

【論文速讀】利用負信號蒸餾&#xff1a;用REDI框架提升LLM推理能力 論文信息 arXiv:2505.24850 cs.LG cs.AI cs.CL Harnessing Negative Signals: Reinforcement Distillation from Teacher Data for LLM Reasoning Authors: Shuyao Xu, Cheng Peng, Jiangxuan Long, Weidi…

Cursor 1.0正式推出:全面解析你的AI 編程助手

目錄 前言 一、BugBot&#xff1a;你的私人代碼審查專家 二、Background Agent&#xff1a;7x24小時在線的云端開發伙伴 三、Jupyter Notebook 深度集成&#xff1a;數據科學家的福音 四、記憶功能 (Memories)&#xff1a;讓 AI 更懂你的項目 五、MCP 與工具生態&#xf…

QILSTE 精巧電子元件H4-108FO/5M解析

型號&#xff1a;H4-108FO/5M 在電子元件的浩瀚宇宙中&#xff0c;H4-108FO/5M 仿佛一顆散發著獨特光芒的恒星&#xff0c;其參數和特性交織成一張錯綜復雜的網絡&#xff0c;既令人困惑又充滿驚喜。這款型號的產品&#xff0c;以其 1.60.80.4mm 的微小尺寸&#xff0c;卻蘊含…

第2章_Excel_知識點筆記

Excel 知識點總結&#xff08;第2章&#xff09; 來自&#xff1a;第2章_Excel_知識點筆記&#xff0c;原筆記 基礎操作 狀態欄&#xff1a;快速查看計數/求和等數據&#xff08;右鍵可配置&#xff09;。篩選&#xff08;CtrlShiftL&#xff09;&#xff1a;按條件顯示數據…

【學習筆記】單例類模板

【學習筆記】單例類模板 一、單例類模板 以下為一個通用的單例模式框架&#xff0c;這種設計允許其他類通過繼承Singleton模板類來輕松實現單例模式&#xff0c;而無需為每個類重復編寫單例實現代碼。 // 命名空間&#xff08;Namespace&#xff09; 和 模板&#xff08;Tem…