OpenCV光流估計:原理、實現與應用

一、什么是光流?

光流(Optical Flow)是計算機視覺中描述圖像序列中像素運動模式的重要概念。它表示圖像中物體在連續幀之間的表觀運動,是由物體或相機的運動引起的。

光流的基本假設

  1. 亮度恒常性:同一物體點在連續幀中的亮度保持不變
  2. 時間持續性:運動隨時間緩慢變化
  3. 空間一致性:鄰近點有相似的運動

二、OpenCV中的光流算法

OpenCV提供了多種光流算法的實現,主要包括:

1. Lucas-Kanade方法

import cv2
import numpy as np# 讀取視頻
cap = cv2.VideoCapture('test.mp4')# 參數設置
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)
lk_params = dict(winSize=(15,15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# 讀取第一幀
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)# 創建隨機顏色
color = np.random.randint(0,255,(100,3))while(1):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()c,d = old.ravel()frame = cv2.line(frame, (a,b),(c,d), color[i].tolist(), 2)frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)cv2.imshow('frame',frame)k = cv2.waitKey(30) & 0xffif k == 27:break# 更新前一幀和特征點old_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)cv2.destroyAllWindows()
cap.release()

2. Farneback稠密光流

import cv2
import numpy as npcap = cv2.VideoCapture('test.mp4')ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255while(1):ret, frame2 = cap.read()if not ret:breaknext = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)# 計算稠密光流flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)# 轉換為極坐標mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])hsv[...,0] = ang*180/np.pi/2hsv[...,2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)cv2.imshow('frame2', bgr)k = cv2.waitKey(30) & 0xffif k == 27:breakelif k == ord('s'):cv2.imwrite('opticalfb.png',frame2)cv2.imwrite('opticalhsv.png',bgr)prvs = nextcap.release()
cv2.destroyAllWindows()

3. DeepFlow和DIS光流

OpenCV還提供了基于深度學習的DIS(Dense Inverse Search)光流算法:

# 初始化DIS光流
dis = cv2.DISOpticalFlow_create(cv2.DISOPTICAL_FLOW_PRESET_FAST)# 計算光流
flow = dis.calc(prev_frame, next_frame, None)

三、光流估計的應用

  1. 運動檢測與跟蹤:通過光流可以檢測視頻中的運動物體
  2. 視頻穩定:利用光流估計相機運動并進行補償
  3. 動作識別:分析人體關節點的光流模式來識別動作
  4. 自動駕駛:估計車輛自身運動和周圍物體的運動
  5. 視頻插幀:基于光流生成中間幀

四、光流估計的挑戰與改進

  1. 光照變化:亮度恒常性假設在實際中常被違反
  2. 遮擋問題:物體被遮擋時難以追蹤
  3. 快速運動:大位移運動難以捕捉
  4. 計算效率:實時性要求高的場景需要優化

改進方法:

  • 使用深度學習模型如FlowNet、PWC-Net
  • 多尺度處理
  • 結合其他特征如深度信息

五、總結

OpenCV提供了豐富的光流估計算法實現,從經典的Lucas-Kanade到基于深度學習的方法。理解光流的基本原理并掌握OpenCV中的實現方法,能夠為計算機視覺應用的開發奠定堅實基礎。在實際應用中,需要根據具體場景選擇合適的光流算法,并考慮其精度和效率的平衡。

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

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

相關文章

Java實現MinIO上傳PDF文件并配置瀏覽器在線打開及vue2上傳頁面

win下載啟動minio結合vue2實現文件上傳瀏覽 一.下載啟動minio 1. 下載minio 2.在D盤創建文件夾 1.首先創建minio文件夾再minio中依次創建bin/data/logs,如下圖 2.把下載的minio.exe放到minio->bin文件中 3.在bin文件夾中輸入cmd打開命令框輸入命令minio.exe server D:…

VR 互動實訓與展示,借科技開啟沉浸式體驗新篇?

對于企業而言,產品設計與展示是極為關鍵的環節,這直接關系到能否成功吸引客戶,以及精準獲取市場反饋。在當下科技飛速發展的時代,VR 互動實訓為這一至關重要的環節注入了全新活力,帶來了前所未有的體驗。以某智能家居企…

進階-數據結構部分:1、數據結構入門

飛書文檔https://x509p6c8to.feishu.cn/wiki/HRLkwznHiiOgZqkqhLrcZNqVnLd 一、存儲結構 順序存儲 鏈式存儲 二、常用數據結構 2.1、棧 先進后出 場景: 后退/前進功能:網頁瀏覽器中的后退和前進按鈕可以使用棧來實現。在瀏覽網頁時,每次…

HarmonyOS Navigation組件深度解析與應用實踐

HarmonyOS Navigation組件深度解析與應用實踐 一、組件架構與核心能力 HarmonyOS Navigation組件作為路由導航的根視圖容器,采用三層架構設計: 標題層:支持主副標題配置,提供Mini/Free/Full三種顯示模式內容層:默認…

基于AI的Web數據管道,使用n8n、Scrapeless和Claude

引言 在當今數據驅動的環境中,組織需要高效的方法來提取、處理和分析網絡內容。傳統的網絡抓取面臨著諸多挑戰:反機器人保護、復雜的JavaScript渲染以及持續的維護需求。此外,理解非結構化的網絡數據則需要復雜的處理能力。 本指南演示了如…

Cadence學習筆記之---PCB器件放置與布局

目錄 01 | 引 言 02 | 環境描述 03 | 元件放置 04 | 布局相關操作 06 | 總 結 01 | 引 言 在上一篇文章中,介紹了如何設置PCB的電氣規則約束,以及如何設置層疊,到此我們已經完成了使用Cadence設計PCB的前期準備工作; 在本篇…

力扣HOT100之二叉樹:199. 二叉樹的右視圖

這道題沒啥好說的,首先定義一個向量來保存每一層的最后一個元素,直接用層序遍歷(廣度優先搜索)遍歷二叉樹,然后將每一層的最后一個元素加入到這個向量中即可。屬于是二叉樹層序遍歷的模板題。 /*** Definition for a …

CSS:三大特性

文章目錄 一、層疊性二、繼承性三、優先級 一、層疊性 二、繼承性 可以在MDN網站上查看屬性是否可以被繼承 例如color 三、優先級

C++經典庫介紹

在 C 開發的漫長歷程中,涌現出了許多經典的庫,它們在不同的領域發揮著重要作用,極大地提升了 C 開發的效率和質量。下面為你介紹一些 C 開發中的經典庫。 標準模板庫(STL) STL 堪稱 C 編程領域的基石,是每…

Git本地使用小Tips

要將本地倉庫 d:\test 的更新推送到另一個本地倉庫 e:\test,可以使用 Git 的遠程倉庫功能。以下是具體步驟: ??在 e:\test 中添加 d:\test 作為遠程倉庫?? 在 e:\test 目錄中打開 Git Bash 或命令行,執行以下命令: git remo…

AWS SageMaker vs Bedrock:該選哪個?

隨著生成式 AI 的快速崛起,越來越多企業希望借助云上工具,加速 AI 應用的構建與落地。AWS 作為領先的云服務提供商,提供了兩款核心 AI 服務:Amazon SageMaker 和 Amazon Bedrock。它們雖然同屬 AWS AI 生態系統,但定位…

51單片機的lcd12864驅動程序

#include <reg51.h> #include <intrins.h>#define uchar

Git .gitattributes 文件用途詳解

.gitattributes 是 Git 版本控制系統中的一個配置文件&#xff0c;用于定義特定文件或路徑的屬性&#xff0c;從而控制 Git 如何處理這些文件。它類似于 .gitignore&#xff0c;但功能更廣泛&#xff0c;可以精細化管理文件在版本控制中的行為。 主要用途 以下是 .gitattribut…

使用 Apache POI 生成 Word 文檔

創建一個包含標題、段落和表格的簡單文檔。 步驟 1:添加依賴 確保你的項目中已經添加了 Apache POI 的依賴。如果你使用的是 Maven,可以在 pom.xml 中添加以下內容: <dependency><groupId>org.apache.poi</groupId>

數據中心 智慧機房解決方案

該文檔介紹數據中心智慧機房解決方案,涵蓋模塊化數據中心(機柜式、微模塊),具備低成本快速部署、標準化建設等特點;監控管理系統(DCIM)可實現設施、資產、容量、能效管理;節能解決方案含精密空調節能控制柜,節能率高達 30%;還有7X24 小時云值守運維服務。方案亮點包括…

java -jar命令運行 jar包時如何運行外部依賴jar包

java -jar命令運行 jar包時如何運行外部依賴jar包 場景&#xff1a; 打包發不完,運行時。發現一個問題&#xff0c; java java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils 顯示此&#xff0c;基本表明&#xff0c;沒有這個依賴&#xff0c;如果在開發…

Halcon與C#:工業級機器視覺開發

Halcon&#xff08;由MVTec開發&#xff09;是一款廣泛應用于工業機器視覺的高性能軟件庫&#xff0c;支持C#、C、Python等多種語言。以下是基于C#的Halcon開發詳解&#xff0c;涵蓋環境配置、核心流程、關鍵API及最佳實踐。 ??1. 開發環境配置?? ??1.1 安裝Halcon?? …

ALTER COLLATION使用場景

ALTER COLLATION 是 SQL 中用于修改字符集排序規則&#xff08;Collation&#xff09;的操作。排序規則定義了字符數據的比較和排序方式&#xff0c;包括字母順序、大小寫敏感性、重音符號處理等。ALTER COLLATION 的使用場景主要集中在需要調整數據庫或表的字符集排序規則時。…

Kafka消息路由分區機制深度解析:架構設計與實現原理

一、消息路由系統的核心架構哲學 1.1 分布式系統的三元悖論 在分布式消息系統的設計過程中&#xff0c;架構師需要平衡三個核心訴求&#xff1a;數據一致性、系統可用性和分區容忍性。Kafka的分區路由機制本質上是對CAP定理的實踐解&#xff1a; 一致性維度&#xff1a;通過…

【網絡實驗】-BGP-EBGP的基本配置

實驗拓撲 實驗要求&#xff1a; 使用兩種方式建立不同AS號的BGP鄰居&#xff0c;不同AS號路由器之間建立的鄰居稱為EBGP鄰居 實驗目的&#xff1a; 熟悉使用物理口和環回口建立鄰居的方式 IP地址規劃&#xff1a; 路由器接口IP地址AR1G0/0/012.1.1.1/24AR1Loopback 01.1.1…