基于opencV的动态背景下运动目标检测及跟踪(修改版)
基于openCV的動態背景下的運動目標檢測
from:?http://www.mianfeiwendang.com/doc/89c6692a222a84b2ced0d502/1
摘要:介紹在動態背景下對視頻圖像序列進行運動目標的檢測,主要包括三個步驟,分別是運動估計,運動補償和目標檢測。在運動估計中采用的主要是基于特征點匹配算法。這種算法與傳統的塊匹配算法最大的好處在于它的數據量少,計算簡單迅速而且圖像的匹配可靠性更高。最后用計算機視覺類庫openCV進行實現。
關鍵詞:運動目標檢測; openCV;特征點匹配
Moving Object Detection in the Dynamic Background Based on openCV Abstract:Introducing a moving object detection algorithm of the dynamic background in the video image sequence,which includes three steps. They are motion estimation, motion compensation and object detection. At the motion estimation, we take an algorithm based on the feature points matching. The advantages of this algorithm is that it needs fewer data and indicates faster calculating speed compared to the block matching algorithm. What’s more, the matching of the video image sequence is more reliable. Then used openCV realized the algorithm.
Keywords: moving object detection; openCV; feature points matching
引言
在生活中攝像頭可以說隨處可見,我們經常需要對視頻中的運動目標進行相關操作,這就設涉及到了對運動目標的檢測及跟蹤。作為視覺領域的一部分,它不僅對我們的生活,在軍事,醫學等各種領域里都有著廣泛的影響。
所謂運動目標的檢測就是在一段序列圖像中檢測出變化區域,并將運動目標從背景圖像中提取出來[2],它是基礎,能否正確的檢測與分割出運動目標對后續的工作有著巨大的影響。常見的運動目標檢測方法有:背景差分法,幀差法,累積差分法,光流法。本文主要介紹的是一種在動態背景下對運動目標進行檢測的算法。
檢測算法介紹
檢測算法有很多種,不同的算法有他們各自的利與弊。背景差分法:是事先將背景圖像存儲下來,再與觀測圖像進行差分運算,實現對運動區域的檢測。這種方法能得到較為完整的運動目標信息,但背景圖像必須隨著外部條件比如光照等的變化而不斷更新,所以背景模型的獲取和更新比較麻煩。幀差法:直接比較相鄰兩幀圖像對應像點的灰度值的不同,然后通過閾值來提取序列圖像中的運動區域[2]。這種方法更新速度快,算法簡單易實現,適應性強,不需要獲取背景圖像。但是背景與運動目標間需要有一定程度的灰度差,否則可能在目標內部產生空洞,不能完整的提取出運動目標。為了改進相鄰兩幀間的差分效果,人們提出了累積差分法。累積差分法是利用三幀圖像計算兩個差分圖像,再令其對應像素相乘的算法。它通過分析整個圖像序列的變化來檢測小位移或緩慢運動的物體。光流法是在時間上連續的兩幅圖想中,用向量來表示移動前后的對應點,在適當平滑性約束的條件下,根據圖像序列的時空梯度估計運動場,通過分析運動場的變化對運動目標和場景進行檢測和分割。
上面的幾種算法都是基于靜態背景下的方法,下面主要介紹動態背景下運動目標的檢測。 因為生活中我們在很多情況下背景圖像都不是靜態的,有時攝像機都是安裝在一個運動的平臺上,或者它本身也會在一定范圍內進行掃描運動這樣一來就會出現圖像背景的全局運動,這時就需要做對幀間圖像的配準,再經過全局背景的運動補償就可以通過差分檢測檢測出目標。
這種通過全局運動估計進行運動目標檢測的主要步驟如圖1-1所示:
運動估計:運動矢量估計的算法有許多種,這里采用的是特征點匹配算法,也是目前使用較多的一種算法。它的方法是在圖像中找到基準圖像的每一特征點的唯一匹配點,通過兩幀間點位置的變化求出其位移矢量,再將所有運動信息帶入運動模型求出背景的全局運動參數。以基準圖像的特征點為中心在打匹配圖像中使用三步搜索算法進行快速搜索,三步搜索算法的具體三步為[4]:
(1) 以當前特征點為中心,以4(可以更改)為步幅,將各單位正方形上的頂點(共9個點)與當前特征點進行匹配,求出最佳匹配的特征點中心位置。
(2) 以第一步求出的最佳特征點為中心,以2為步幅,將各單位正方形上的頂點(共9個點)與當前特征點進行匹配,求出最佳匹配的特征點中心位置。
(3) 以第二步求出的最佳特征點為中心,以1為步幅,將各單位正方形上的頂點(共9個點)與當前特征點進行匹配,求出最佳匹配的特征點中心位置。
它與當前特征點中心的位置偏移量即為估計的位移量。
在openCV中CvBlob結構是描述的團塊位置,大小標識符,我們可以對它進行簡單的改寫來表示我們需要的特征點。
運動補償:這一步的主要目的是盡量將由于攝像機的掃描而引起的背景“移動”消除。這里不需要估計所有像素點的運動矢量,在上面特征點匹配的基礎上,采用仿射變換模型參數。設t時刻特征點的位置為(X,Y),t+1時刻的坐標為(X’,Y’),若以二維仿射變換描述其運動,則關系可表示為:
X’ d0 X Y’
由上式可知三個不共線的特征點就可以求得唯一解,顯然這是不合理的,所以我們采用最小二乘法,用所有已知特征點來求解參數。這樣可以減小誤差。反向運動補償后當前的幀圖像和參考的幀圖像重合這樣就可以消除因攝像機掃描晃動而引起的背景移動。
目標檢測:將背景圖像的穩定序列進行幀差即可獲得運動目標區域,完成目標檢測。
結合openCV
openCV簡介:OpenCV是一個基于(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法[1]。
openCV常用函數:
分配圖像:IplImage* cvCreateImage(CvSize size, int depth, int channels);
depth為像素深度,channels為每個像素值的通道數
釋放圖像:void cvRealeaseImage(IplImage**);
讀取圖像:img=cvLoadImage(filename);//filename為文件的目錄名
openCV基礎結構:
CvPoint:定義整型坐標上的點
Typedef struct CvPoint{
} Int x; //x坐標 Int y; //y坐標
上文中的矩形表達式主要用的就是CvPoint這個函數。用CvPoint來定義點(X,Y)
CvSize:定義矩形框大小
Typedef struct CvSize{
Int width;
Int height;
}
還有其他基礎結構如:CvRect,CvScalar,CvMat,CvArr,IplImage等就不一一介紹了。
首先cvCvtColor函數轉換圖片至灰度圖:灰度化就是將一張三通道RGB顏色的圖像變成單通道灰度圖,為接下來的圖像處理做準備。在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值。下圖為灰度圖:
cvThreshold函數轉換為自適應二值圖:二值化是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的黑白效果,二值化的處理強化了銳利的邊緣,進一步去除圖像中無用的信息,但在使用過程中要注意閾值的選取。可以說二值化是數字圖像處理中非常重要的最基礎的一步,可以發現我們在做很多項目過程中,第一步往往就是進行二值化處理。
接下來就是進行一系列形態學腐蝕膨脹處理,在閾值分割后,圖像中可能還存在一些空洞噪聲影響,形態學處理進行進一步去噪等。膨脹腐蝕主要是通過cvDilate和cvErode這兩個函數來實現效果,在用openCV結合上面的算法最后處理出的結果如下圖:
結論
由此可以看出在openCV環境下用特征點匹配的算法可以對動態背景下的運動目標進行檢測。
參考文獻:
[1]百度百科
[2]《數字圖像處理系統工程導論》 郭寶龍 孫偉 主編 西安電子科技大學出版社
[3]《數字圖像處理(應用篇)》 谷口慶治 編 科學出版社共立出版
[4]《數字圖像處理與圖像通信(修訂版)》 朱秀昌 劉峰 胡棟 編 北京郵電大學出版社
[5]《OpenCV教程(基礎篇)》 劉瑞禎 于仕琪 編著 北京航空航天大學出版社
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的基于opencV的动态背景下运动目标检测及跟踪(修改版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高动态范围图像-多图
- 下一篇: 动态视频目标检测和跟踪技术(入门)