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
繁體地址,請注明出處:http://hk.pswp.cn/news/908972.shtml
英文地址,請注明出處:http://en.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 =