OpenCV中的光流估計方法詳解

文章目錄

    • 一、引言
    • 二、核心算法原理
      • 1. 光流法基本概念
      • 2. 算法實現步驟
    • 三、代碼實現詳解
      • 1. 初始化設置
      • 2. 特征點檢測
      • 3. 光流計算與軌跡繪制
    • 四、實際應用效果
    • 五、優化方向
    • 六、結語

一、引言

在計算機視覺領域,運動目標跟蹤是一個重要的研究方向,廣泛應用于視頻監控、自動駕駛、人機交互等場景。本文將介紹如何使用OpenCV中的Lucas-Kanade光流法實現簡單的運動目標軌跡跟蹤,并詳細解析代碼實現。

二、核心算法原理

1. 光流法基本概念

光流(Optical Flow)是圖像中物體運動造成的視覺"流動",描述了像素點在連續幀之間的運動模式。Lucas-Kanade算法是一種經典的稀疏光流算法,它基于以下三個假設:

  • 亮度恒定(同一特征點的亮度不隨時間變化)
  • 時間持續性(運動隨時間緩慢變化)
  • 空間一致性(鄰近點有相似運動)

2. 算法實現步驟

  1. 特征點檢測:使用Shi-Tomasi角點檢測
  2. 光流計算:金字塔Lucas-Kanade方法
  3. 軌跡繪制:連接連續幀中的特征點

三、代碼實現詳解

1. 初始化設置

import numpy as np
import cv2# 視頻讀取和參數初始化
cap = cv2.VideoCapture('test.avi')
color = np.random.randint(0,255,(100,3))  # 隨機顏色用于軌跡繪制

2. 特征點檢測

# 讀取第一幀并轉換為灰度圖
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)# Shi-Tomasi角點檢測參數
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)
  • 使用角點檢測方法找到特征點
goodFeaturesToTrack(image,maxCorners,qualityLevel,minDistance,corners=None,mask=None,blockSize=None)
  • image:輸入單通道圖像。用灰度圖
  • maxCorners:設定最大的角點個數,是最有可能的角點數,如果這個參數不大于0,那么表示沒有角點數的限制。
  • qualityLevel:圖像角點的最小可接受參數,質量測量值乘以這個參數就是最小特征值,小于這個數的會被拋棄。
  • minDistance:角點之間最小的歐氏距離
  • mask:檢測區域,如果圖像不是空的,它指定檢測角的區域。
  • 返回所有角點坐標位置:corners

3. 光流計算與軌跡繪制

# LK光流參數
lk_params = dict(winSize=(15,15), maxLevel=2)while True:ret, frame = cap.read()if not ret:breakframe_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 計算光流p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# 篩選成功跟蹤的點good_new = p1[st==1]good_old = p0[st==1]# 繪制軌跡for i, (new, old) in enumerate(zip(good_new, good_old)):a, b = new.ravel().astype(int)c, d = old.ravel().astype(int)mask = cv2.line(mask, (a,b), (c,d), color[i].tolist(), 2)img = cv2.add(frame, mask)cv2.imshow('frame', img)# 更新前一幀數據old_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)

計算光流,獲取新的特征點位置和狀態

calcOpticalFlowPyrLK(prevImg,nextImg,prevPts,nextPts,status=None,err=None,winSize=None,maxLevel=None,criteria=None,flags=None,minEigThreshold=None)
  • prevImg:前一幀圖像
  • nextImg:當前幀圖像
  • prevPts:前一幀圖像中特征點坐標位置
  • nextPts:當前幀圖像中特征點坐標,可以為None
  • winSize:搜索窗口的大小
  • maxLevel:金字塔層數
  • criteria:停止迭代的準則
  • 返回值
  • nextPts:在當前幀中估計出的特征點坐標
  • status:一個與prevPts一樣大小的狀態向量,用于表示特征點是否被成功跟蹤到。
  • err:一個與prevPts一樣大小的誤差向量,用于表示估計誤差

四、實際應用效果

運行程序后,可以看到視頻中檢測到的特征點及其運動軌跡。不同顏色的線條代表不同特征點的運動路徑,直觀展示了物體的運動情況。

顯示效果如下:左邊是一段有很多人在走動的視頻,右邊就是根據人物運動的軌跡畫出的軌跡圖。
在這里插入圖片描述

五、優化方向

  1. 特征點選擇優化:可以嘗試其他特征檢測算法如SIFT、SURF等
  2. 運動模型改進:引入卡爾曼濾波等預測算法提高跟蹤穩定性
  3. 遮擋處理:添加特征點重新檢測機制應對遮擋情況
  4. 性能優化:使用多線程處理提高實時性

六、結語

本文實現了一個基于OpenCV的簡單運動目標跟蹤系統,展示了光流法的基本應用。雖然實現相對簡單,但包含了目標跟蹤的核心思想。讀者可以在此基礎上進行擴展,開發更復雜的跟蹤系統。

我們定能不負所托 不負所望!!!🚀🚀🚀

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

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

相關文章

零基礎入門MySQL:10分鐘搞定數據庫基本操作

📚 一、MySQL是什么? MySQL 是一個關系型數據庫管理系統(簡單理解:用“表格”存儲數據的倉庫)。 就像Excel表格一樣,數據按行和列整齊存放,方便快速查找和管理! 為什么要學MySQL&a…

LeetCode 3335.字符串轉換后的長度 I:I先遞推

【LetMeFly】3335.字符串轉換后的長度 I:I先遞推 力扣題目鏈接:https://leetcode.cn/problems/total-characters-in-string-after-transformations-i/ 給你一個字符串 s 和一個整數 t,表示要執行的 轉換 次數。每次 轉換 需要根據以下規則替…

Linux 系統如何掛載U盤

一、問題描述 Linux系統不像Windows系統有圖形化界面,對于機房服務器安裝的Linux尤其如此,那么有時候需要拷貝U盤或者光盤的文件到Linux系統中去,與 Windows 系統自動為 U 盤分配盤符不同,Linux 系統需要手動將 U 盤掛載到指定目…

Qt進階開發:QTcpServer的詳解

文章目錄 一、QTcpServer 簡介二、常用成員函數的使用三、信號函數的使用四、虛函數的使用五、連接多客戶端-服務端示例一、QTcpServer 簡介 QTcpServer 是 Qt 網絡模塊中的一個核心類,用于實現 基于 TCP 協議的服務端(Server),它負責監聽端口、接收客戶端連接請求,并通過…

大項目k8s集群有多大規模,多少節點,有多少pod

1. 實際參與過生產級 K8s 集群 回答示例: 目前我負責的 K8s 集群規模為 300 個物理節點,分布在 3 個可用區(AZ),采用多控制平面高可用架構。集群日常運行約 12,000 個 Pod,資源利用率保持在 65%-75%&#…

是 OpenCV 的 CUDA 模塊中用于在 GPU 上對圖像或矩陣進行轉置操作函數cv::cuda::transpose

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::cuda::transpose 是 OpenCV 的 CUDA 模塊中的一個函數,用于在 GPU 上對圖像或矩陣進行轉置操作(Transpose&#xff0…

使用 goaccess 分析 nginx 訪問日志

介紹 goaccess 是一個在本地解析日志的工具, 可以直接在命令行終端環境中使用 TUI 界面查看分析結果, 也可以導出為更加豐富的 HTML 頁面. 官網: https://goaccess.io/ 下載安裝 常見的 Linux 包管理器中都包含了 goaccess, 直接安裝就行. 以 Ubuntu 為例: sudo apt instal…

Google LLM prompt engineering(谷歌提示詞工程指南)

文章目錄 基本概念AI輸出配置:調整AI的回答方式輸出長度溫度(Temperature)Top-K和Top-P 提示技術:讓AI更好地理解你零樣本提示(Zero-shot)少樣本提示(Few-shot)系統提示(…

簡單介紹Qt的屬性子系統

深入理解Qt的屬性系統 ? 筆者最近正在大規模的開發Qt的項目和工程,這里筆者需要指出的是,這個玩意在最常規的Qt開發中是相對比較少用的,筆者也只是在Qt的QPropertyAnimation需要動畫感知筆者設置的一個屬性的時候方才知道這個東西的。因此&…

NestJS 框架深度解析

框架功能分析 NestJS 是一個基于 Node.js 的漸進式框架,專為構建高效、可擴展的服務器端應用程序而設計。其核心理念結合了 面向對象編程(OOP)、函數式編程(FP) 和 函數式響應式編程(FRP)&…

PostgreSQL技術大講堂 - 第89講:重講數據庫完全恢復

PostgreSQL技術大講堂 - 第89講,主題:重講數據庫完全恢復 時間:2025年05月10日19:30 歡迎持續關注CUUG PostgreSQL技術大講堂。

ubuntu部署supabase

安裝supabse https://supabase.com/docs/guides/local-development/cli/getting-started?queryGroupsplatform&platformlinux brew install supabase/tap/supabase supabase init supabase start需要使用brewuser進行安裝: brew安裝參考鏈接: ht…

基于javaweb的SpringBoot酒店管理系統設計與實現(源碼+文檔+部署講解)

技術范圍:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

python 上海新聞爬蟲, 東方網 + 澎湃新聞

1. 起因, 目的: 繼續做新聞爬蟲。我之前寫過。此文先記錄2個新聞來源。后面打算進行過濾,比如只選出某一個類型新聞。 2. 先看效果 過濾出某種類型的新聞,然后生成 html 頁面,而且,自動打開這個頁面。 比如科技犯罪…

使用bitNet架構

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、配置二、報錯總結 前言 大型語言模型(LLM)面臨的挑戰:高能耗、高內存需求、部署門檻高。 微軟提出 BitNet 架構&#x…

筆試強訓(十七)

文章目錄 活動安排題解代碼 哈夫曼編碼題解代碼 奇數位丟棄題解代碼 活動安排 題目鏈接 題解 1. 區間貪心 排序 2. 如果有重疊部分,每次選擇右端點較小的,可以盡可能多的選擇區間個數,如果沒有重疊部分,選擇下一個區間的右端…

數據庫數據清洗、預處理與質量監控、 數據質量的核心概念

數據庫數據清洗、預處理與質量監控、 數據質量的核心概念 準確性 (Accuracy) 準確性指數據正確反映其所描述的實體或事件真實狀況的程度。準確的數據應當與現實世界中的實際情況一致。 一致性 (Consistency) 一致性指數據在不同表、系統或時間點之間保持邏輯上一致的程度。…

Docker組件詳解:核心技術與架構分析

Docker詳解:核心技術與架構分析 Docker作為一種容器化技術,已經徹底改變了軟件的開發、交付和部署方式。要充分理解和利用Docker的強大功能,我們需要深入了解其核心組件以及它們如何協同工作。本文將詳細介紹Docker的主要組件、架構設計以及…

【言語】刷題3

front:刷題2 題干 超限效應介紹冰桶挑戰要避免超限效應 B明星的作用只是病痛挑戰的一個因素,把握程度才是重點,不是強化弱化明星作用,排除 A雖沒有超限效應,但是唯一的點出“冰桶效應”的選項,“作秀之嫌…

【fastadmin開發實戰】在前端頁面中使用bootstraptable以及表格中實現文件上傳

先看效果: 1、前端頁面中引入了表格 2、表格中實現文件上傳 3、增加截止時間頁面 難點在哪呢? 1、這是前端頁面,并不支持直接使用btn-dialog的類屬性實現彈窗; 2、前端頁面一般綁定了layout模板,如何實現某個頁面不…