「轉載」淺談影像監控之背景建立技術

偵測移動物件是智慧型監控系統內含的一個極為重要的步驟,任何監控系統必定含有此一步驟,相關的研究論文也非常多,目的都在於能夠更準確、快速的偵測到移動物件,其後續的工作如:移動物件的追蹤、辨認…等程序都高度依賴移動物件偵測的準確與否,偵測移動物件的正確性甚至足以決定整個系統的可靠度與精確性,是評估一個監控系統好壞的決定性因素。

以影像處理的方法偵測移動物件主要有兩種方法:1.連續影像相減(Temporal differencing)、2.背景相減法(Background subtraction)。

連續影像相減(Temporal differencing)原理是利用再時間上連續的影像做一對一的像素相減,若是兩者差異為零,就表示此像素不屬於移動物件像素,反之,則此像素為移動物件像素。此法對於環境的改變適應性佳,但是偵測出的移動物件常常會發生內部破碎的情形,如此一來,移動物件的形狀較不完整,對於後續的移動物件追蹤與辨識將無法提供完整的資訊。

背景相減法(Background subtraction)不會有物件內部破碎的問題,原因是背景相減法會先建立一背景模型,再將新影像與此背景模型作一對一的像素亮度值相減,藉此偵測出移動物件像素,最後偵測出完整的物件形狀。

上述兩種方法,又以背景相減法(Background subtraction)是目前較受歡迎的方法,主因除了可以擷取出移動物件的完整形狀,對雜訊也有相對較好的容忍度,也可以減輕移動物件造成的陰影所產生的影響。

在背景相減法的基礎底下,又有很多類的方法,不同的地方在於背景影像產生的方式以及更新的方法,大部分的方法可以約略分為三個種類:1.靜態攝影機之非迭代式的方法(Non-recursive approaches with stationary camera)、2. .靜態攝影機之迭代式的方法(Recursive approaches with stationary camera)、3.非靜態攝影機的背景模型(Panorama background image with non-stationary camera)。

靜態攝影機之非迭代式的方法通常使用滑動視窗(Sliding window)的方法更新背景模型,把一段影像的每個頁面儲存在此滑動視窗中,藉此分析視窗中頁面的每個像素值在時間軸上的變化量,估測出背景影像,使用滑動視窗的原因是保持背景模型在最新的狀態,藉由捨去舊的像素資訊,納入新的像素,然而,若是要處理移動速度較慢的物件時,自然需要長度較長的滑動視窗,也因此對儲存空間的需求將會變得巨大,這個問題可以藉由降低儲存頁面的頻率,也就是每隔數個頁面存入一個頁面,可以獲得部分的改善。幾個常見的靜態攝影機非迭代式的方法,在以下說明:

時間軸上的中間值法(Temporal median),是最常見的建立背景影像的方法,背景影像選取方法為取一段時間內視窗中像素值的中間值,也就是假設真正的背景像素會停留超過視窗長度的一半時間(頁面數),R. Cucchiara et al. [1]把此方法推展到彩色影像;計算出像素中間直的複雜度為 ;B. Shoushtarian et al. [2]比較了三種非迭代式建立背景影像的方法,分別為非前景像素更新法(Selective update using non-foreground pixels)、時間軸上的平均值法(Selective update using temporal averaging)與時間軸上的中間值法(Selective update using temporal median),其中非前景像素更新法(Selective update using non-foreground pixels)就是前景偵測後之背景像素更新為新的背景像素,其餘前景像素部分則用之前的背景像素替代,此法在戶外環境效果會比較不理想,因為戶外光線變化劇烈時,此更新法會使得背景影像無法隨著光線變化更新成符合現狀的背景影像;時間軸上的平均值法(Selective update using temporal averaging)取滑動視窗中的像素值的平均值,以此值作為新的背景像素值,此法會出現錯誤的情形在於存入滑動視窗的像素若包含移動物件,取平均值將會造成新的背景像素失真的現象;時間軸上的中間值法(Selective update using temporal median)取滑動視窗中每個頁面所有像素之中間值,形成新的背景影像,此法再偵測移動物件有較正確的效果,不過在計算出中間值的計算複雜度頗高,且需要的儲存空間也來得大。

非參數式的統計模型(Non-parametric model),不像之前使用單一背景模型的方法,Elgammal et al. [3]利用一段時間內( )的像素值資訊形成一非參數式的機率密度函數 ,公式如下所示:

(1)

函數K是基底函數,選定為高斯函數,若是目前的像素值 不屬於此分佈函數,則此點認定為前景像素,也就是說,當 之機率值小於事先定意義好的門檻值時,此點就會被分類為前景像素;使用機率密度函數的好處是可以處理較複雜的多重背景模式,如反覆搖晃的樹影等等。

靜態攝影機之迭代式的方法不需要儲存一段影像的像素值資訊,而是以迭代的方式在每個頁面進行更新背景模型的各項參數,因此,在很久以前的頁面也影響到目前的背景模型;與非迭帶式的方法比較,迭代式的方法需要較少的儲存空間,但是若是出現誤判的情形,將會導致錯誤持續一段時間。目前的方法採用指數型的權重來去除過去的資訊,並只選用正確的背景像素進行參數的更新估測,具代表性的方法在以下加以說明:

Kalman filter是一種追蹤移動物件很常見的遞迴式方法,目前有許多以Kalman filter為中心建立背景模型的方法,不同處主要為所使用的狀態空間有所差異。最簡單的方法為僅使用亮度值,C. Wren et al. [4]就是其中很經典的例子。

高斯混合(Mixture of Gaussians)(MoG),不同於Kalman filter僅追蹤單一高斯分佈,MoG可以同時追蹤多個高斯分佈,目前MoG是在建立背景模型各種方法裡廣受普遍採用的方法;由於MoG是參數式模型,所以不需另外的空間儲存一段影像資訊,而可以動態的更新背景磨型的各個重要參數,C. Stauffer et al. [5]以K個高斯分佈建立像素點的分佈模型:

(2)

其中 是第 個高斯分佈,平均值為 ,標準差 是第 個高斯分佈的權重值。大致上,K值約在3到之間,K值愈大,所需的記憶容量也愈大。

對於新的像素 ,第一個步驟先找出與其最接近的高斯分佈,判定為相符的條件式為 ,其中T為一個小的正數,相符的高斯分佈模型各個參數的更新方法(3)如下:

(3)

其中 是事先定義好的學習率, 的定義(4)如下所示:

(4)

目前的MoG方法的發展主要為參數對環境敏感度的分析、運算複雜度的改進、背景模型更新速度調整,與將其延伸到全景影像(Panoramic background)。

P. KaewTraKulPong et al. [6]針對[5]提出了改進的方法,利用兩種模式的參數估測方法,系統運作初期利用較花時間但是正確性高的估測(Expected sufficient statistics),可以建立一個穩固的基礎,到達指定的時間後,使用較不花運算時間的估測方式,如此一來可以有效改善[5]的運算時間與增加背景參數的準確度。

I. Haritaoglu et al. [7]使用兩個高斯模型建立背景模型,而隨機變數有三個,分別為訓練期間(Training period)的各個像素的最小值、最大值與亮度值的最大變化量,利用訓練期間建立背景模型分為兩個階段,在前20至40秒利用中間值法抽取出靜態的像素點,因為此一特性,[7]的訓練期間並不需要一段完全靜止的影像序列;另外[7]建立了一張表記錄每個像素的變化情形以決定更新的方法,以像素為基礎的更新方式(Pixel-based update)週期性的更新每個像素以適應環境的緩慢光線變化;另外,有移動物件出現或者原先靜止的背景物件開始移動時,以物件為基礎的更新方法可以針對此部分處理。

非靜態攝影機的背景模型也是目前監控系統的一個大研究方向,把受監控的完整環境建構成一大全景背景模型,全景影像取得方法主要有兩種:1. 使用廣角的攝影機,不過由於價錢昂貴,在遠離焦點的部分影像失真情況嚴重,因此通常比較少被使用。2.使用普通攝影機擷取的影像,經過處理建立全景影像,如此一來,解析度高而且不會發生失真的狀況,這樣的特性可以滿足影像處理的各個應用,S. E. Chen et al. [8]架設固定位置的攝影機,以不同的側擺(Panning)角度拍攝,利用軟體的方法比對建立360度的全景影像。Y. Ren et al. [9]使用空間上的高斯分佈(Spatial distribution of Gaussian)處理攝影機受到風吹的微小震動,其2D轉換公式(5)對像素做座標轉換。

(5)

其中分別為攝影機側擺、仰(俯)的角度,(, )、(,)分別為原始攝影機擷取之影像座標與經過轉換後全景影像座標。

S. Kang et al. [10]使用鑲嵌式的方法(Mosaic technique)將單一角度的影像投射出攝影機各種不同仰(俯)角、側擺方向的影像,運用各種角度的搭配計算出相似的矩陣(Homogeneous matrix),以比對出相對應的位置,此法的好處是無須知道攝影機的內部參數,如焦距等等,缺點則是若攝影機轉動後,擷取到的影像不是事前定義好的連續有交疊的影像時,需要重新更新才能繼續偵測移動物件,解決之道可採用廣角的攝影機,不過也會有影像失真的問題。

後續的步驟如移動物件的追蹤、辨認在一個智慧型監控系統中也是很重要的,舉例來說,智慧型監控系統若內建十大槍擊要犯的各種特徵與資訊,某日若在某台攝影機偵測到的移動物件的特徵經過辨認器的比對發現與某逃犯的特徵非常類似,則追蹤的機制就可以持續追蹤嫌疑犯並於同一時間發出警訊,達到我們預期中理想的智慧型監控系統應該具備的功能。

隨著公共安全的需求日益增加,智慧型監控系統成為目前電腦視覺相關研究領域中非常活躍的一個部分,其中的困難與挑戰雖然很多,不過從事相關研究的人員投注莫大的心力,部分的困難都可以找到很好的解決方案,由於投入的研究學者越來越多,相信與人類一樣聰明而且永不倦怠的智慧型監控系統就在前方的不遠處。

 


 

參考資料
 

[1] R. Cucchiara, C. Grana, M. Piccardi, and A. Prati, “Detecting moving objects, ghosts, and shadows in video streams,” IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 25, No. 10, pp. 1337-1342, 2003.

[2] B. Shoushtarian, and H. E. Bez, “A practical adaptive approach for dynamic background subtraction using an invariant colour model and object tracking,” Pattern Recognition Letters, Vol. 26, No. 1 pp. 5-26, 2005.

[3] A. Elgammal, R. Duraiswami, D. Harwood, and L. S. Davis, “Background and foreground modeling using nonparametric kernel density estimation for visual surveillance,” Proc. IEEE, Vol. 90, No. 7, pp. 1151-1163, 2002.

[4] C. R. Wren, A. Azarbayejani, T. Darrell, and A. P. Pentland, “Pfinder: Real-time tracking of the human body,” IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 19, No. 7, pp. 780-785, 1997.

[5] C. Stauffer, and W. E. L. Grimson, “Adaptive background mixture models for real-time tracking,” IEEE Computer Society Conference on Computer Vision and Pattern Recognition, Vol. 2, pp. 246-252, 1999.

[6] P. KaewTraKulPong, and R. Bowden, “An improved background mixture model for real-time tracking with shadow detection,” Proc. 2nd European Workshop on Advanced Video Based Surveillance Systems, Vol. 25, 2001.

[7] I. Haritaoglu, D. Harwood, and L. S. Davis, “: Real-time surveillance of people and their activities,” IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 22, No. 8, pp. 809-830, 2000.

[8] S. E. Chen, “QuickTime VR – An image based approach to virtual environment navigation,” Proc. SIGGRAPH 95, pp. 29-38, 1995.

[9] Y. Ren, C. S. Chua, and Y. K. Ho, “Statistical background modeling for non-stationary camera,” Pattern Recognition Letters, Vol. 24, pp. 183-196, 2003.

[10] S. Kang, J. Paik, A. Koschan, B. Abidi, and M. A. Abidi, “Real-time video tracking using PTZ cameras,” Proc. of SPIE 6th International Conference on Quality Control by Artificial Vision, Vol. 5132, pp. 103-111, 2003.

How to use fdisk within a shell script


$vim test_fdisk
=====================================
=====================================
$chmod +x test_fdisk
$./test_fdisk 1 +1G

Howto build Thunar 1.0.0 on Ubuntu9.04

1. Download source code
$wget http://thunar.xfce.org/download/sources/Thunar/1.0.0/Thunar-1.0.0.tar.bz2
$wget http://thunar.xfce.org/download/sources/exo/0.3.100/exo-0.3.100.tar.bz2

2. 解壓縮
$tar xvf Thunar-1.0.0.tar.bz2
$tar xvf exo-0.3.100.tar.bz2

3. Configure & Make


Howto Install Clutter Development Environment

1. To use, add the relevent line for your distribution to /etc/apt/sources.list and apt-get update.
deb http://debian.o-hand.com etch/ deb http://debian.o-hand.com unstable/  deb http://debian.o-hand.com edgy/ deb http://debian.o-hand.com feisty/ deb http://debian.o-hand.com gutsy/ deb http://debian.o-hand.com hardy/

[轉載]Howto Install OpenGL Development Environment

Howto Install OpenGL Development Environment

目錄

[隱藏]

前言

OpenGL 是一套由SGI公司發展出來的繪圖函式庫,它是一組 C 語言的函式,用於 2D 與 3D 圖形應用程式的開發上。

OpenGL 讓程式開發人員不需要考慮到各種顯示卡底層運作是否相同的問題,硬體由 OpenGL 核心去溝通,因此只要顯示卡支援 OpenGL,那麼程式就不需要重新再移植,而程式開發人員也不需要重新學習一組函式庫來移植程式。

接下來,我們就一步一步的在Ubuntu底下建立開發OpenGL應用程式的環境。

安裝

建立基本編譯環境

首先不可或缺的,就是編譯器與基本的函式庫,如果系統沒有安裝的話,請依照下面的方式安裝:

sudo apt-get install build-essential 

安裝OpenGL Library

接下來要把我們會用到的 Library 裝上去,首先安裝 OpenGL Library

sudo apt-get install libgl1-mesa-dev 

安裝OpenGL Utilities

OpenGL Utilities 是一組建構於 OpenGL Library 之上的工具組,提供許多很方便的函式,使 OpenGL 更強大且更容易使用。 接下來我們安裝OpenGL Utilities

sudo apt-get install libglu1-mesa-dev 

安裝OpenGL Utility Toolkit

OpenGL Utility Toolkit 是建立在 OpenGL Utilities 上面的工具箱,除了強化了 OpenGL Utilities 的不足之外,也增加了 OpenGL 對於視窗介面支援。

sudo apt-get install libglut-dev 

設定編譯參數與編譯

在這之前,我們需要一個測試範例,example.c 如下:

#include   void init(); void display();  int main(int argc, char* argv[]) {  glutInit(&argc, argv);  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  glutInitWindowPosition(0, 0);  glutInitWindowSize(300, 300);    glutCreateWindow("OpenGL 3D View");    init();  glutDisplayFunc(display);    glutMainLoop();  return 0; }  void init() {  glClearColor(0.0, 0.0, 0.0, 0.0);  glMatrixMode(GL_PROJECTION);  glOrtho(-5, 5, -5, 5, 5, 15);  glMatrixMode(GL_MODELVIEW);  gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); }  void display() {  glClear(GL_COLOR_BUFFER_BIT);     glColor3f(1.0, 0, 0);  glutWireTeapot(3);    glFlush(); } 

有了測試範例、基礎編譯環境與各個 OpenGL 相關的函式庫之後,我們所需要做的就是告訴編譯器我們有安裝 OpenGL 函式庫,編譯程式時要連結這些函式庫。

gcc example.c -o example.out -lGL -lGLU -lglut 

因為我們安裝了 OpenGL Utility Toolkit ,它是建立在 OpenGL Utilities 與 OpenGL Library 之上,因此我們可以簡單連結 OpenGL Utility Toolkit 的函式庫就可以達到我們的目地了。下面的編譯參數跟上面的是同樣效果:

gcc example.c -o example.out -lglut 

下面簡單說明一下所使用的 gcc 參數

-l  告訴 gcc 去連結指定 Library -o     指定執行檔的輸出名字 

執行

接下來我們就可以來看看我們的結果,如果看到右圖,代表成功了!

圖片:Teapot.png
Freesamael用 OpenGL 畫的茶壺
./example.out 

參考

連結

OpenGL 教學文件

特別感謝

Freesamael 熱心提供茶壺

[轉載]Howto Install OpenGL Development Environment

Howto Install OpenGL Development Environment

目錄

[隱藏]

前言

OpenGL 是一套由SGI公司發展出來的繪圖函式庫,它是一組 C 語言的函式,用於 2D 與 3D 圖形應用程式的開發上。

OpenGL 讓程式開發人員不需要考慮到各種顯示卡底層運作是否相同的問題,硬體由 OpenGL 核心去溝通,因此只要顯示卡支援 OpenGL,那麼程式就不需要重新再移植,而程式開發人員也不需要重新學習一組函式庫來移植程式。

接下來,我們就一步一步的在Ubuntu底下建立開發OpenGL應用程式的環境。

安裝

建立基本編譯環境

首先不可或缺的,就是編譯器與基本的函式庫,如果系統沒有安裝的話,請依照下面的方式安裝:

sudo apt-get install build-essential 

安裝OpenGL Library

接下來要把我們會用到的 Library 裝上去,首先安裝 OpenGL Library

sudo apt-get install libgl1-mesa-dev 

安裝OpenGL Utilities

OpenGL Utilities 是一組建構於 OpenGL Library 之上的工具組,提供許多很方便的函式,使 OpenGL 更強大且更容易使用。 接下來我們安裝OpenGL Utilities

sudo apt-get install libglu1-mesa-dev 

安裝OpenGL Utility Toolkit

OpenGL Utility Toolkit 是建立在 OpenGL Utilities 上面的工具箱,除了強化了 OpenGL Utilities 的不足之外,也增加了 OpenGL 對於視窗介面支援。

sudo apt-get install libglut-dev 

設定編譯參數與編譯

在這之前,我們需要一個測試範例,example.c 如下:

#include   void init(); void display();  int main(int argc, char* argv[]) { 	glutInit(&argc, argv); 	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 	glutInitWindowPosition(0, 0); 	glutInitWindowSize(300, 300); 	 	glutCreateWindow("OpenGL 3D View"); 	 	init(); 	glutDisplayFunc(display); 	 	glutMainLoop(); 	return 0; }  void init() { 	glClearColor(0.0, 0.0, 0.0, 0.0); 	glMatrixMode(GL_PROJECTION); 	glOrtho(-5, 5, -5, 5, 5, 15); 	glMatrixMode(GL_MODELVIEW); 	gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); }  void display() { 	glClear(GL_COLOR_BUFFER_BIT); 		 	glColor3f(1.0, 0, 0); 	glutWireTeapot(3); 	 	glFlush(); } 

有了測試範例、基礎編譯環境與各個 OpenGL 相關的函式庫之後,我們所需要做的就是告訴編譯器我們有安裝 OpenGL 函式庫,編譯程式時要連結這些函式庫。

gcc example.c -o example.out -lGL -lGLU -lglut 

因為我們安裝了 OpenGL Utility Toolkit ,它是建立在 OpenGL Utilities 與 OpenGL Library 之上,因此我們可以簡單連結 OpenGL Utility Toolkit 的函式庫就可以達到我們的目地了。下面的編譯參數跟上面的是同樣效果:

gcc example.c -o example.out -lglut 

下面簡單說明一下所使用的 gcc 參數

-l  告訴 gcc 去連結指定 Library -o     指定執行檔的輸出名字 

執行

接下來我們就可以來看看我們的結果,如果看到右圖,代表成功了!

圖片:Teapot.png
Freesamael用 OpenGL 畫的茶壺
./example.out 

參考

連結

OpenGL 教學文件

特別感謝

Freesamael 熱心提供茶壺

死迴圈

while list do list done
当list为True时,该圈会不停地执行。
例一 : 无限回圈写法
#!/bin/sh

while : ; do
echo "do something forever here"
sleep 5
done

例二 : 强迫把pppd杀掉。
#!/bin/sh

while [ -f /var/run/ppp0.pid ] ; do
killall pppd
done



--------------------------------------------------------------------------------

until list do list done
当list为False(non-zero)时,该圈会不停地执行。
例一 : 等待pppd上线。
#!/bin/sh
until [ -f /var/run/ppp0.pid ] ; do
sleep 1
done

Verifying a filesystem mount in a bash script

Sometimes you need to check if a drive is properly mounted before performing a scripted operation. A few Linux tools can detect whether they are on an NFS share or not, but there is no shorthand to find if a certain path is the mounted filesystem or an empty unmounted directory.

The easiest method appears to be using grep to evaluate the output of df or mount. Instead of the lines containing the string, the quiet mode of grep (-q option) returns an error code representing whether the string was found. This can be placed in a conditional inside a shell script like in the following example:

if df |grep -q '/mnt/mountpoint$'
then
echo "Found mount point, running task"
# Do some stuff
else
echo "Aborted because the disk is not mounted"
# Do some error correcting stuff
exit -1
fi

虹光大成就-密教灌頂(一)