OpenCV 團塊跟蹤

2021-07-12 06:38:18 字數 2818 閱讀 2385

一、概述

opencv 團塊跟蹤過程細分為:前景檢測模組、新團塊(blob)檢測模組、團塊跟蹤模組、軌跡生成模組和軌跡後處理模組。而跟蹤流程模組cvblobtrackerauto把這五個模組連線起來。如下圖所示:

各個模組的功能:

(1)、前景檢測模組:對每個畫素判斷其是前景還是背景;

(2)、新團塊檢測模組:使用前景檢測的結果檢測新進入場景的團塊;

(3)、團塊跟蹤模組:使用新團塊檢測模組的結果初始化該模組,並跟蹤新進入的團塊;

(4)、軌跡生成模組:主要是儲存操作。它收集所有團塊的位置,並在每條軌跡結束時將其儲存到硬碟上;

(5)、軌跡後處理模組:進行軌跡的平滑操作。此模組是可選的,可以不包含在處理流程中;

(6)、跟蹤流程模組:將前面提到的五個模組連線起來,形成乙個處理流程;

二、前景檢測模組

前景檢測模組將當前幀上的畫素分為前景畫素和背景畫素。opencv 實現了兩種前景檢測方法:混合高斯模型和liyuan li 的acm ********** 2003 會議**中的演算法。

cvfgdetector 是個虛類,描述了前景檢測模組介面。前景檢測模組的輸入資料為當前幀影象,輸出資料為當前幀的前景掩碼(mask)。其結構定義如下:

class cvfgdetector

三、新團塊檢測模組

cvblobdetector 是乙個虛類,用來描述新團塊檢測模組的介面。新團塊檢測模組的輸入資料為當前的前景掩碼和已有的團塊,輸出資料為新檢測到的團塊。新團塊檢測模組作用是將新進入物體的位置和大小檢測到。模組結構如下:

class cvblobdetector

cvblobdetector 兩個子類 cvblobdetector****** 和 cvblobdetectorcc。下面簡單介紹cvblobdetectorcc:detectnewblob 的處理流程。首先從前景影象pfgmask中檢測出所有團塊,然後將較小的團塊(可能是由雜訊引起的)和已經被跟蹤團塊有重疊的團塊丟棄,並對剩餘的團塊按照大小排序,僅保留10個最大的團塊。將這幾個團塊作為候選新的團塊,對它們利用各種篩選,篩除掉不符合標準的團塊,將最後真正的新團塊儲存到變數pnewbloblist中。

四、團塊跟蹤模組

cvblobtracker 是乙個虛類,用來描述團塊跟蹤模組的介面。團塊跟蹤模組的輸入資料為當前幀(是bgr影象)、當前幀的前景掩碼和新團塊,輸出資料為當前幀的團塊資訊(id,pos,size)。模組結構如下:

class cvblobtracker: ;

cvblobtrackercc::process 處理流程是:首先從前景影象pimgfg提取所有團塊,並計算團塊的質心、寬度和高度。然後對每乙個已經被跟蹤的軌跡,利用卡爾曼濾波器**該軌跡在當前幀的團塊的位置和大小。如果變了m_collision值非零,則對當前跟蹤的所有團塊進行碰撞檢測。如果某兩個團塊存在碰撞,則設定其屬性collision為1。最後一步是對每個跟蹤的軌跡進行處理,尋找離上一幀的團塊最近的當前幀裡的團塊,將此團塊加入到跟蹤軌跡。下圖是團塊跟蹤列表:

五、軌跡生成模組

cvblobtrackergen 是用來實現軌跡生成模組的乙個虛類。此模組的目的是將整個軌跡儲存到指定檔案中,同時,也可以為每乙個團塊計算一些特徵並儲存。軌跡生成模組的輸入資料為當前幀的所有團塊,輸出資料為儲存的軌跡列表。模組資料結構如下:

classcvblobtrackgen ;

virtual void    setfilename(char* pfilename) = 0;

virtual void    addblob(cvblob* pblob) = 0;

virtual void    process(iplimage* pimg = null, iplimage* pfg = null) = 0;

virtual void    release() = 0;};

六、軌跡後處理模組

cvblobtrackpostproc 是用來實現軌跡後處理模組的乙個虛類。此模組的目的是在團塊軌跡上做一些濾波處理。例如此模組可以是kalman 濾波或其他的平滑濾波。軌跡後處理模組的輸入資料為當前幀的所有團塊,輸出資料為當前幀的所有團塊。模組結構如下:

class cvblobtrackpostproc

return null;

};};

軌跡後處理的流程如圖如下:

七、處理流程模組

cvblobtrackerauto 是乙個虛類,用於整合其他模組,構成乙個跟蹤流程。該模組定義的結構如下:

class cvblobtrackerauto ;

virtual float       getstate(int blobid) = 0;

virtual const char*       getstatedesc(int blobid) = 0;

/* return 0 if trajectory is normal;

* return >0 if trajectory abnormal. */

virtual void    release() = 0;};

該類關鍵函式是cvblobtrackerauto1::process,它負責呼叫其他各子模組。具體流程圖如下:

opencv顏色跟蹤

這篇文章是我看 opencv python tutorial 中文版 的筆記 思路是掩膜 位運算 物體跟蹤 將影象轉換到hsv空間 設定hsv閾值到藍色範圍 獲取藍色物體k 0 cap cv2.videocapture 0 while 1 ret,frame cap.read hsv cv2.cvt...

OpenCV 臉部跟蹤 3

前面一篇文章我們生成了臉部特徵的線性形狀模型,本章來學習一下顯示線性形狀的 線性模型類的結構如下 class shape model 我們生成的線性形狀模型用矩陣v表示,它是152 18,前四列是旋轉縮放矩陣r,接著是保留的14副特徵影象。通過下面的 計算平移和縮放 float scale calc...

Opencv之邊界跟蹤

問題描述 一般是將二值化後的影象進行邊界的提取。需要說明的是這個提取不是簡單的找到邊界,而是按照順序的找出來。即邊界上的點是按照鄰接關係依次給出。相關演算法 1 這裡解釋 程式實現 還有canny演算法之類的一推 opencv的現有演算法 有兩個函式 findcontours和cvfindconto...