《OpenCV》——光流估計

什么是光流估計?

在這里插入圖片描述

光流估計的前提?

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

基本假設

  • 亮度恒定假設:目標像素點的亮度在相鄰幀之間保持不變。這是光流計算的基礎假設,基于此可以建立數學方程來求解光流。
  • 時間連續或運動平滑假設:相鄰幀之間的時間間隔足夠小,使得像素點的運動是連續的,不會發生突變;或者說相鄰像素點的運動情況是相似的,具有平滑性。

經典算法

  • Lucas-Kanade 光流算法:該算法基于局部平滑假設,通過在一個小的窗口內對多個像素點進行約束,求解光流方程。它是一種基于梯度的方法,計算效率較高,常用于實時性要求較高的應用中。
  • Horn-Schunck 光流算法:是一種全局的光流估計算法,在亮度恒定和光滑性約束的基礎上,通過最小化一個能量函數來求解光流。它考慮了整幅圖像的信息,能夠得到較為平滑的光流場,但計算量相對較大。
  • 基于深度學習的光流估計算法:近年來,隨著深度學習的發展,基于卷積神經網絡(CNN)的光流估計算法取得了很好的效果。例如 FlowNet、PWC-Net 等,這些算法通過大量的訓練數據學習圖像之間的運動模式,能夠處理復雜的場景和運動情況,并且在精度和速度上都有了很大的提升。

實例

對視頻中的人物走動軌跡進行光流追蹤處理。
實現了基于 Lucas - Kanade 算法的稀疏光流估計,用于處理視頻中的運動跟蹤。

  • 導入必要的庫
import numpy as np
import cv2

導入numpy庫用于數值計算,cv2是 OpenCV 庫,用于計算機視覺任務

  • 打開視頻文件并初始化顏色
cap = cv2.VideoCapture('test.avi')
color = np.random.randint(0, 255, (100, 3))

cv2.VideoCapture(‘test.avi’):打開名為test.avi的視頻文件。
np.random.randint(0, 255, (100, 3)):生成 100 個隨機的 RGB 顏色,用于后續繪制光流軌跡。

  • 讀取第一幀并轉換為灰度圖
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)

cap.read():讀取視頻的第一幀,ret是一個布爾值,表示是否成功讀取幀,old_frame是讀取的幀圖像。
cv2.cvtColor():將彩色圖像轉換為灰度圖像,因為光流估計通常在灰度圖像上進行。

  • 檢測特征點
feature_params = dict(maxCorners=100,qualityLevel=0.3,minDistance=7)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)

cv2.goodFeaturesToTrack():使用 Shi - Tomasi 角點檢測算法檢測圖像中的特征點。

feature_params是一個字典,包含了角點檢測的參數:

  • maxCorners:最多檢測的角點數量。
  • qualityLevel:角點質量的閾值,只有質量高于該閾值的角點才會被保留。
  • minDistance:相鄰角點之間的最小距離。
  • 初始化掩碼圖像
mask = np.zeros_like(old_frame)

創建一個與第一幀圖像大小相同的全零掩碼圖像,用于繪制光流軌跡。

  • 設置 Lucas - Kanade 光流算法的參數
lk_params = dict(winSize=(15, 15),maxLevel=2)

winSize:搜索窗口的大小,用于在計算光流時對每個像素點周圍的區域進行分析。
maxLevel:金字塔的最大層數,用于處理大位移的光流。

  • 循環處理視頻幀
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]

cap.read():讀取視頻的下一幀。
cv2.calcOpticalFlowPyrLK():使用金字塔 Lucas - Kanade 算法計算光流。

  • old_gray:前一幀的灰度圖像。
  • frame_gray:當前幀的灰度圖像。
  • p0:前一幀檢測到的特征點。
  • p1:當前幀中對應的特征點位置。
  • st:狀態數組,用于表示每個特征點是否被成功跟蹤,st == 1表示成功跟蹤。
  • err:每個特征點的跟蹤誤差。
  • 繪制光流軌跡
    for i, (new, old) in enumerate(zip(good_new, good_old)):a, b = new.ravel()c, d = old.ravel()a, b, c, d = int(a), int(b), int(c), int(d)mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)img = cv2.add(frame, mask)

cv2.line():在掩碼圖像上繪制從舊特征點到新特征點的線段。
cv2.add():將掩碼圖像與當前幀圖像疊加,得到帶有光流軌跡的圖像。

  • 顯示結果并更新幀信息
 cv2.imshow('mask', mask)cv2.imshow('frame', img)k = cv2.waitKey(150)if k == 27:breakold_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)

cv2.imshow():顯示掩碼圖像和帶有光流軌跡的圖像。
cv2.waitKey(150):等待 150 毫秒,按下按鍵則返回按鍵的 ASCII 碼。
k == 27:如果按下 ESC 鍵(ASCII 碼為 27),則退出循環。
更新前一幀的灰度圖像和特征點信息,以便下一幀的光流計算。

  • 釋放資源
cv2.destroyAllWindows()
cap.release()

cv2.destroyAllWindows():關閉所有打開的窗口。
cap.release():釋放視頻捕獲對象。
這段代碼通過 Lucas - Kanade 算法實現了視頻中特征點的光流估計,并將光流軌跡繪制在視頻幀上。它可以幫助我們觀察視頻中物體的運動情況。

  • 結果:
    在這里插入圖片描述

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

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

相關文章

信息系統的安全防護

文章目錄 引言**1. 物理安全****2. 網絡安全****3. 數據安全****4. 身份認證與訪問控制****5. 應用安全****6. 日志與監控****7. 人員與管理制度****8. 其他安全措施****9. 安全防護框架**引言 從技術、管理和人員三個方面綜合考慮,構建多層次、多維度的安全防護體系。 信息…

如何進行OceanBase 運維工具的部署和表性能優化

本文來自OceanBase 用戶的實踐分享 隨著OceanBase數據庫應用的日益深入,數據量不斷攀升,單個表中存儲數百萬乃至數千萬條數據的情況變得愈發普遍。因此,部署專門的運維工具、實施針對性的表性能優化策略,以及加強指標監測工作&…

如何防止 Instagram 賬號被盜用:安全設置與注意事項

如何防止 Instagram 賬號被盜用:安全設置與注意事項 在這個數字化時代,社交媒體平臺如 Instagram 已成為我們日常生活的一部分。然而,隨著網絡犯罪的增加,保護我們的在線賬戶安全變得尤為重要。以下是一些關鍵的安全設置和注意事…

Redis|復制 REPLICA

文章目錄 是什么能干嘛怎么玩案例演示復制原理和工作流程復制的缺點 是什么 官網地址:https://redis.io/docs/management/replication/Redis 復制機制用于將數據從一個主節點(Master)復制到一個或多個從節點(Slave)&a…

對象存儲之Ceph

Ceph 對象存儲概述 Ceph 是一個開源分布式存儲系統,旨在提供高度可擴展、高度可用、容錯、性能優異的存儲解決方案。它結合了塊存儲、文件系統存儲和對象存儲的功能,且在設計上具有極高的可擴展性和靈活性。 在 Ceph 中,對象存儲&#xff0…

Document對象

DOM4j中,獲得Document對象的方式有三種: 1.讀取XML文件,獲得document對象 SAXReader reader new SAXReader(); Document document reader.read(new File("input.xml")); 2.解析XML形式的文本,得到document對象…

樹莓集團南京產業園再布局:深入剖析背后邏輯

在產業園區蓬勃發展的當下,樹莓集團在南京的產業園再布局行動備受矚目。這一舉措并非偶然,其背后蘊含著深刻且多元的戰略邏輯。 一、順應區域產業發展趨勢 南京作為長三角地區的重要城市,產業基礎雄厚且多元。近年來,南京大力推動…

Pytorch實現之腦電波圖像生成

簡介 簡介:采用雙GAN模型架構來生成腦電波與目標圖像。 論文題目:Image Generation from Brainwaves using Dual Generative Adversarial Training(使用雙生成對抗訓練的腦電波圖像生成) 會議:IEEE Global Conference on Consumer Electronics (GCCE) 摘要:表示通過無…

HTML解析 → DOM樹 CSS解析 → CSSOM → 合并 → 渲染樹 → 布局 → 繪制 → 合成 → 屏幕顯示

一、關鍵渲染流程 解析 HTML → 生成 DOM 樹 瀏覽器逐行解析 HTML&#xff0c;構建**DOM&#xff08;文檔對象模型&#xff09;**樹狀結構 遇到 <link> 或 <style> 標簽時會暫停 HTML 解析&#xff0c;開始加載 CSS 解析 CSS → 生成 CSSOM 將 CSS 規則解析為**…

劍指offer - 面試題11 旋轉數組的最小數字

題目鏈接&#xff1a;旋轉數組的最小數字 第一種&#xff1a;正確寫法&#xff08;num[m]和nums[r]比較&#xff09; class Solution { public:/*** 代碼中的類名、方法名、參數名已經指定&#xff0c;請勿修改&#xff0c;直接返回方法規定的值即可** * param nums int整型v…

Spring源碼分析の循環依賴

文章目錄 前言一、循環依賴問題二、循環依賴的解決三、整體流程分析 前言 常見的可能存在循環依賴的情況如下&#xff1a; 兩個bean中互相持有對方作為自己的屬性。 ??類似于&#xff1a; 兩個bean中互相持有對方作為自己的屬性&#xff0c;且在構造時就需要傳入&#xff1a…

Docker 部署 Jenkins持續集成(CI)工具

[TOC](Docker 部署 Jenkins持續集成(CI)工具) 前言 Jenkins 是一個流行的開源自動化工具&#xff0c;廣泛應用于持續集成&#xff08;CI&#xff09;和持續交付&#xff08;CD&#xff09;的環境中。通過 Docker 部署 Jenkins&#xff0c;可以簡化安裝和配置過程&#xff0c;并…

《Effective Objective-C》閱讀筆記(中)

目錄 接口與API設計 用前綴避免命名空間沖突 提供“全能初始化方法” 實現description方法 盡量使用不可變對象 使用清晰而協調的命名方式 方法命名 ?編輯類與協議命名 為私有方法名加前綴 理解OC錯誤模型 理解NSCopying協議 協議與分類 通過委托與數據源協議進行…

C++程序員內功修煉——Linux C/C++編程技術匯總

在軟件開發的宏大版圖中&#xff0c;C 語言宛如一座巍峨的高山&#xff0c;吸引著無數開發者攀登探索。而 Linux 操作系統&#xff0c;以其開源、穩定、高效的特性&#xff0c;成為了眾多開發者鐘愛的開發平臺。將 C 與 Linux 相結合&#xff0c;就如同為開發者配備了一把無堅不…

數據庫索引:缺點與類型全解析

在數據庫的世界里&#xff0c;索引就像是一本書的目錄&#xff0c;它能幫助我們快速定位到所需的數據&#xff0c;極大地提升查詢效率。然而&#xff0c;就如同任何事物都有兩面性一樣&#xff0c;索引也并非完美無缺。今天&#xff0c;我們就來深入探討一下索引的缺點以及常見…

【python】提取word\pdf格式內容到txt文件

一、使用pdfminer提取 import os import re from pdfminer.high_level import extract_text import docx2txt import jiebadef read_pdf(file_path):"""讀取 PDF 文件內容:param file_path: PDF 文件路徑:return: 文件內容文本"""try:text ext…

嵌入式八股文(五)硬件電路篇

一、名詞概念 1. 整流和逆變 &#xff08;1&#xff09;整流&#xff1a;整流是將交流電&#xff08;AC&#xff09;轉變為直流電&#xff08;DC&#xff09;。常見的整流電路包括單向整流&#xff08;二極管&#xff09;、橋式整流等。 半波整流&#xff1a;只使用交流電的正…

精選案例展 | 智己汽車—全棧可觀測驅動智能化運營與成本優化

本案例為“觀測先鋒 2024 可觀測平臺創新應用案例大賽”精選案例&#xff0c;同時榮獲IT168“2024技術卓越獎評選-年度創新解決方案”獎。 項目背景 近年來&#xff0c;中國汽車行業進入轉型升級階段&#xff0c;智能網聯技術成為行業發展的核心。車聯網、自動駕駛等技術的加速…

速通HTML

目錄 HTML基礎 1.快捷鍵 2.標簽 HTML進階 1.列表 a.無序列表 b.有序列表 c.定義列表 2.表格 a.內容 b.合并單元格 3.表單 a.input標簽 b.單選框 c.上傳文件 4.下拉菜單 5.文本域標簽 6.label標簽 7.按鈕標簽 8.無語義的布局標簽div與span 9.字符實體 HTML…

【Python模塊】——pymysql

pymysql是python操作mysql的標準庫&#xff0c;可以通過pip install快速導入pymysql包操作數據庫 使用pymysql操作mysql 簡單demo import pymysql connect pymysql.connect(host"localhost",port3306,user"root",password"root",database&quo…