opencv-Meanshift 和 Camshift 算法

MeanShiftCamShift 都是用于目標跟蹤的算法,基于顏色直方圖的方法。它們主要用于在視頻序列中追蹤運動的對象。

  1. MeanShift(均值漂移):

    • 原理: MeanShift 算法的基本思想是通過不斷調整窗口的中心,使得窗口中的樣本點的平均值向目標的密度最大的區域移動。具體來說,它使用核密度估計來尋找樣本分布的最大概率密度,并將窗口中心移動到密度最大的位置。

    • 應用: MeanShift 在靜止相機下的目標跟蹤中表現較好,但對于一些場景變化較大、目標形變明顯的情況,可能會出現跟蹤不穩定的問題。

  2. CamShift(連續自適應均值漂移):

    • 原理: CamShift 是 MeanShift 的改進版本,主要是在 MeanShift 的基礎上增加了對目標的尺度變化和旋轉的適應性。CamShift 在追蹤時可以調整窗口的大小和方向,從而適應目標的尺度和旋轉變化。

    • 應用: CamShift 在相機運動和目標變形較大的情況下更為穩健,它可以自適應地調整窗口大小和方向,以適應目標的變化。

cv2.polylines 函數用于在圖像上繪制多邊形。以下是函數的一般形式和參數說明:

cv2.polylines(img, pts, isClosed, color, thickness[, lineType[, shift]])
  • img: 要繪制多邊形的圖像。

  • pts: 多邊形的頂點。這是一個包含數組的列表,每個數組表示一個頂點的坐標。

  • isClosed: 一個布爾值,指示多邊形是否封閉。如果為 True,則多邊形將首尾相連形成封閉圖形。

  • color: 多邊形的顏色,通常是一個表示顏色的元組,例如 (B, G, R)。

  • thickness: 多邊形邊界的厚度。

  • lineType(可選): 線條的類型,通常使用默認值 cv2.LINE_8

  • shift(可選): 像素坐標點的小數位數,通常使用默認值 0。

cv2.CamShift 是 OpenCV 中用于實現 CamShift(Continuous Adaptive Mean Shift)目標跟蹤算法的函數。CamShift 是 MeanShift 算法的一種擴展,能夠自適應地調整窗口的大小和方向,以適應目標的尺度和旋轉變化。

以下是 cv2.CamShift 函數的一般形式和參數說明:

retval, track_window = cv2.CamShift(probImage, window, criteria)
  • probImage: 反向投影圖像,表示目標的概率分布。

  • window: 初始搜索窗口的位置和大小,通常由之前的目標檢測或跟蹤給出。

  • criteria: 定義迭代停止條件的元組 (type, maxCount, epsilon)

    • type: 迭代停止類型,通常為 cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT

    • maxCount: 最大迭代次數。

    • epsilon: 迭代停止的閾值。

  • retval: 一個包含返回值的元組,其中包括追蹤目標的信息,如位置、大小和方向。

  • track_window: 更新后的追蹤窗口。

cv2.meanShift 是 OpenCV 中用于實現 MeanShift 目標跟蹤算法的函數。MeanShift 是一種迭代的無參數方法,用于尋找圖像中的目標區域。該算法主要用于目標在靜止相機下的跟蹤。

以下是 cv2.meanShift 函數的一般形式和參數說明:

retval, track_window = cv2.meanShift(probImage, window, criteria)
  • probImage: 反向投影圖像,表示目標的概率分布。

  • window: 初始搜索窗口的位置和大小,通常由之前的目標檢測或跟蹤給出。

  • criteria: 定義迭代停止條件的元組 (type, maxCount, epsilon)

    • type: 迭代停止類型,通常為 cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT

    • maxCount: 最大迭代次數。

    • epsilon: 迭代停止的閾值。

  • retval: 一個包含返回值的元組,其中包括追蹤目標的信息,如位置和大小。

  • track_window: 更新后的追蹤窗口。

在 OpenCV 中,可以使用 cv2.meanShift 函數進行 MeanShift 算法的目標跟蹤,以及 cv2.CamShift 函數進行 CamShift 算法的目標跟蹤。以下是一個簡單的示例,演示如何使用 CamShift 進行目標跟蹤:

import cv2
import numpy as np# 讀取視頻文件
cap = cv2.VideoCapture(r"C:\Users\mzd\Desktop\opencv\1.mp4")# 讀取第一幀
ret, frame = cap.read()# 定義追蹤窗口的初始位置
x, y, w, h = 300, 200, 100, 50
track_window = (x, y, w, h)# 提取追蹤窗口中的直方圖
roi = frame[y:y+h, x:x+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, (0, 60, 32), (180, 255, 255))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)# 設置追蹤參數
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)while True:ret, frame = cap.read()if not ret:break# 將當前幀轉換為 HSV 色彩空間hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 使用反向投影計算圖像中的目標位置dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)# 應用 CamShift 算法進行目標跟蹤ret, track_window = cv2.CamShift(dst, track_window, term_crit)# 繪制跟蹤窗口pts = cv2.boxPoints(ret)pts = np.int0(pts)img = cv2.polylines(frame, [pts], True, (0, 255, 0), 2)cv2.imshow('CamShift Tracking', img)if cv2.waitKey(30) & 0xFF == 27:breakcap.release()
cv2.destroyAllWindows()

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

在這個示例中,我們首先讀取視頻并提取第一幀,然后定義了追蹤窗口的初始位置。接著,我們從追蹤窗口中提取直方圖,并在每一幀中使用反向投影計算目標的位置,并應用 CamShift 算法進行目標跟蹤。最后,使用 OpenCV 的繪圖函數在圖像上繪制跟蹤窗口。

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

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

相關文章

介紹正則表達式及其用法

正則表達式(Regular Expression),簡稱為"正則",是一種用于描述、匹配、搜索文本的方式。正則表達式通常由符號和字符組成,可以用于匹配和搜索特定模式的文本。 以下是一些常用的正則表達式元字符及其用法&am…

多模態常見任務介紹

視覺問答(VQA, Visual Question Answer) 目標:給定一個圖片以及問題,需要理解圖片的內容并基于此用自然語言回答問題。 例如,圖像中發生什么事,人物穿的衣服是什么顏色,圖像中有多…

復亞智能交通無人機:智慧交通解決方案大公開

城市的現代化發展離不開高效的交通管理規劃。傳統的交通管理系統龐大繁瑣,交警在執行任務時存在安全隱患。在這一背景下,復亞智能交通無人機應運而生,成為智慧交通管理中的重要組成部分。交通無人機憑借其高靈活性、低成本、高安全性等特點&a…

兒童在線學習系統 寶寶云幼兒園服務微信小程序的設計與實現

綜合運用所學的程序設計基礎、數據結構、數據庫原理及應用、高級語言程序設計、面向對象程序設計、軟件需求分析與建模、軟件設計與體系結構、軟件測試等課程知識,設計開發一個較實用的應用系統。 通過該設計可以鞏固并提高軟件工程專業學生的軟件需求分析、設計、開…

SpringCloud原理-OpenFeign篇(四、請求原理)

文章目錄 前言正文一、書接上回,從代理對象入手二、ReflectiveFeign.FeignInvocationHandler#invoke()三、SynchronousMethodHandler#invoke(...) 的實現原理3.1 invoke(...)源碼3.2 executeAndDecode(...) 執行請求并解碼 四、如何更換client 的實現 附錄附1&#…

【Python】生死簿管理系統,估值5毛

生死簿管理系統 代碼 """ 生死簿管理系統 """ import os import timefile_name data.txtdef main():while True:main_menu()choice (int)(input("請選擇: "))if choice in [0, 1, 2, 3, 4, 5, 6, 7]:if choice 0:answer input(&…

「樹形」樣式,數據關聯超便捷丨三疊云

樹形樣式 路徑 表單設計 >> 字段屬性 功能簡介 「表單關聯」的數據列表樣式支持「樹形」樣式功能,關聯數據選擇時通過「樹形」的列表方式進行數據選擇,提高生產效率。 使用場景: 可以通過樹形列表樣式展示部門、子部門、成員的樹形…

30㎡新中式大橫廳|方寸之間,訴說東方寫意生活。福州中宅裝飾,福州裝修

今天要分享的是一個新中式風格的客廳裝修,它的開間是4.5米,進深是6.5米。設計中有許多亮點,讓我們一起來看看。 1?? 首先,這個客廳采用了雙眼皮無主燈吊頂的設計,讓整個空間看起來更加高挑寬敞。吊頂的邊緣線條簡潔明…

Re53:讀論文 How Can We Know What Language Models Know?

諸神緘默不語-個人CSDN博文目錄 諸神緘默不語的論文閱讀筆記和分類 論文名稱:How Can We Know What Language Models Know? ArXiv網址:https://arxiv.org/abs/1911.12543 官方GitHub項目(prompt之類的都有):https:…

詳解Rust編程中的生命周期

1.摘要 生命周期在Rust編程中是一個重要概念, 它能確保引用像預期的那樣一直有效。在Rust語言中, 每一個引用都有其生命周期, 通俗講就是每個引用在程序執行的過程中都有其自身的作用域, 一旦離開其作用域, 其生命周期也宣告結束, 值不再有效。幸運的是, 在絕大多數時間里, 生…

15 reids哨兵機制

redis主機默認是10s發送一次心跳給從節點。 從節點默認1s去發送心跳給主節點。 1、原理 當主節點出現故障時,由Redis Sentinel自動完成故障發現和轉移,并通知應用方,實現高可用性。 從節點的主要兩個作用: 主節點的數據備份。…

【2023年APMCM亞太杯C題】完整代碼+結果分析+論文框架

2023年APMCM亞太杯C題 完整代碼結果分析論文框架第一問問題分析技術文檔1 基于AHP的新能源汽車發展影響因素分析1.1 AHP模型的構建1.2 AHP模型的求解 2 基于自適應ARIMA-非線性回歸模型的影響因素預測2.1 ARIMA模型的建立2.2 非線性回歸模型的建立2.3 自適應混合ARIMA-非線性回…

【數據結構/C++】線性表_順序表的基本操作

#include <iostream> using namespace std; #define MaxSize 10 // 1. 順序表 // 靜態分配 typedef struct {int data[MaxSize];int length; // 當前長度 } SqList; // 靜態分配初始化順序表 void InitList(SqList &L) {for (int i 0; i < MaxSize; i){L.data[i]…

政務大數據與資源平臺建設解決方案:PPT全文75頁,附下載

關鍵詞&#xff1a;智慧政務解決方案&#xff0c;大數據解決方案&#xff0c;數據中心解決方案&#xff0c;數據治理解決方案 一、政務大數據與資源平臺建設背景 1、政務大數據已成為智慧城市建設的必要基礎 為響應國家不斷加快5G基建、大數據、人工智能等新型基礎設施建設布…

在MySQL中,修改字段A相同的記錄的字段B ,要使得字段C小的記錄的字段B值等于字段C大的記錄的字段B值

例如&#xff1a;更新具有相同電話號碼的用戶記錄&#xff0c;使得updatetime小的記錄的name值等于updatetime大的記錄的name值。 首先&#xff0c;我們需要創建一個用戶表&#xff0c;這個用戶表包含以下字段&#xff1a;phone&#xff0c;updatetime, name。以下是創建這個表…

Redis的性能,哨兵模式,集群,

Redis的性能管理; redis的數據保存在內存中 redis-cli info memory redis內存使用info memory命令參數解析 used_memory:236026888 由 Redis 分配器分配的內存總量&#xff0c;包含了redis進程內部的開銷和數據占用的內存&#xff0c;以字節&#xff08;byte&#xff09…

css里面的@import

import 說明 用于從其他樣式表導入樣式規則。可以是絕對或相對路徑&#xff0c;也可以是一個在線的url地址。import 規則必須在 CSS 文檔的頭部&#xff0c;但可以在 charset 規則后面。import 規則不是一個嵌套語句&#xff0c;import不能在條件組的規則中使用。import 規則…

虛擬化原理

目錄 什么是虛擬化廣義虛擬化狹義虛擬化 虛擬化指令集敏感指令集虛擬化指令集的工作模式監視器對敏感指令的處理過程&#xff1a; 虛擬化類型全虛擬化類虛擬化硬件輔助虛擬化 虛擬化架構裸金屬架構宿主機模式架構 什么是虛擬化 虛擬化就是通過模仿下層原有的功能模塊創造接口來…

【開源】基于JAVA的衣物搭配系統

項目編號&#xff1a; S 016 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S016&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S016&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、研究內容2.1 衣物檔案模塊2.2 衣物搭配模塊2.3 衣…

linux進程調度(二)-進程創建

文章目錄 2.進程創建和終止2.1 進程創建的4種方法2.2 進程創建過程分析2.2.1 copy_process函數分析2.2.1.1 dup_task_struct函數分析2.2.1.2 sched_fork函數分析2.2.1.3 copy_mm函數分析2.2.1.4 copy_thread函數分析 2.2.2 wake_up_new_task函數分析 2.進程創建和終止 在 Linu…