卡爾曼濾波器 – Kalman Filter
1. 什么是卡爾曼濾波器
(What is the Kalman Filter?)
在學(xué)習(xí)卡爾曼濾波器之前,首先看看為什么叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級數(shù)等等)一樣,卡爾曼也是一個人的名字,而跟他們不同的是,他是個現(xiàn)代人!
卡爾曼全名Rudolf Emil Kalman,匈牙利數(shù)學(xué)家,1930年出生于匈牙利首都布達(dá)佩斯。1953,1954年于麻省理工學(xué)院分別獲得電機(jī)工程學(xué)士及碩士學(xué)位。1957年于哥倫比亞大學(xué)獲得博士學(xué)位。我們現(xiàn)在要學(xué)習(xí)的卡爾曼濾波器,正是源于他的博士論文和1960年發(fā)表的論文《A New Approach to Linear Filtering and Prediction Problems》(線性濾波與預(yù)測問題的新方法)。如果對這編論文有興趣,可以到這里的地址下載: http://www.cs.unc.edu/~welch/media/pdf/Kalman1960.pdf。
簡單來說,卡爾曼濾波器是一個“optimal recursive data processing algorithm(最優(yōu)化自回歸數(shù)據(jù)處理算法)”。對于解決很大部分的問題,他是最優(yōu),效率最高甚至是最有用的。他的廣泛應(yīng)用已經(jīng)超過30年,包括機(jī)器人導(dǎo)航,控制,傳感器數(shù)據(jù)融合甚至在軍事方面的雷達(dá)系統(tǒng)以及導(dǎo)彈追蹤等等。近年來更被應(yīng)用于計算機(jī)圖像處理,例如頭臉識別,圖像分割,圖像邊緣檢測等等。
2.卡爾曼濾波器的介紹
(Introduction to the Kalman Filter)
為了可以更加容易的理解卡爾曼濾波器,這里會應(yīng)用形象的描述方法來講解,而不是像大多數(shù)參考書那樣羅列一大堆的數(shù)學(xué)公式和數(shù)學(xué)符號。但是,他的5條公式是其核心內(nèi)容。結(jié)合現(xiàn)代的計算機(jī),其實卡爾曼的程序相當(dāng)?shù)暮唵?,只要你理解了他的?/span>5條公式。
在介紹他的5條公式之前,先讓我們來根據(jù)下面的例子一步一步的探索。
假設(shè)我們要研究的對象是一個房間的溫度。根據(jù)你的經(jīng)驗判斷,這個房間的溫度是恒定的,也就是下一分鐘的溫度等于現(xiàn)在這一分鐘的溫度(假設(shè)我們用一分鐘來做時間單位)。假設(shè)你對你的經(jīng)驗不是100%的相信,可能會有上下偏差幾度。我們把這些偏差看成是高斯白噪聲(White Gaussian Noise),也就是這些偏差跟前后時間是沒有關(guān)系的而且符合高斯分配(Gaussian Distribution)。另外,我們在房間里放一個溫度計,但是這個溫度計也不準(zhǔn)確的,測量值會比實際值偏差。我們也把這些偏差看成是高斯白噪聲。
好了,現(xiàn)在對于某一分鐘我們有兩個有關(guān)于該房間的溫度值:你根據(jù)經(jīng)驗的預(yù)測值(系統(tǒng)的預(yù)測值)和溫度計的值(測量值)。下面我們要用這兩個值結(jié)合他們各自的噪聲來估算出房間的實際溫度值。
假如我們要估算k時刻的是實際溫度值。首先你要根據(jù)k-1時刻的溫度值,來預(yù)測k時刻的溫度。因為你相信溫度是恒定的,所以你會得到k時刻的溫度預(yù)測值是跟k-1時刻一樣的,假設(shè)是23度,同時該值的高斯噪聲的偏差是5度(5是這樣得到的:如果k-1時刻估算出的最優(yōu)溫度值的偏差是3,你對自己預(yù)測的不確定度是4度,他們平方相加再開方,就是5)。然后,你從溫度計那里得到了k時刻的溫度值,假設(shè)是25度,同時該值的偏差是4度。
由于我們用于估算k時刻的實際溫度有兩個溫度值,分別是23度和25度。究竟實際溫度是多少呢?相信自己還是相信溫度計呢?究竟相信誰多一點,我們可以用他們的covariance來判斷。因為Kg^2=5^2/(5^2+4^2),所以Kg=0.78,我們可以估算出k時刻的實際溫度值是:23+0.78*(25-23)=24.56度??梢钥闯觯驗闇囟扔嫷?/span>covariance比較?。ū容^相信溫度計),所以估算出的最優(yōu)溫度值偏向溫度計的值。
現(xiàn)在我們已經(jīng)得到k時刻的最優(yōu)溫度值了,下一步就是要進(jìn)入k+1時刻,進(jìn)行新的最優(yōu)估算。到現(xiàn)在為止,好像還沒看到什么自回歸的東西出現(xiàn)。對了,在進(jìn)入k+1時刻之前,我們還要算出k時刻那個最優(yōu)值(24.56度)的偏差。算法如下:((1-Kg)*5^2)^0.5=2.35。這里的5就是上面的k時刻你預(yù)測的那個23度溫度值的偏差,得出的2.35就是進(jìn)入k+1時刻以后k時刻估算出的最優(yōu)溫度值的偏差(對應(yīng)于上面的3)。
就是這樣,卡爾曼濾波器就不斷的把covariance遞歸,從而估算出最優(yōu)的溫度值。他運行的很快,而且它只保留了上一時刻的covariance。上面的Kg,就是卡爾曼增益(Kalman Gain)。他可以隨不同的時刻而改變他自己的值,是不是很神奇!
下面就要言歸正傳,討論真正工程系統(tǒng)上的卡爾曼。
3. 卡爾曼濾波器算法
(The Kalman Filter Algorithm)
在這一部分,我們就來描述源于Dr Kalman 的卡爾曼濾波器。下面的描述,會涉及一些基本的概念知識,包括概率(Probability),隨即變量(Random Variable),高斯或正態(tài)分配(Gaussian Distribution)還有State-space Model等等。但對于卡爾曼濾波器的詳細(xì)證明,這里不能一一描述。
首先,我們先要引入一個離散控制過程的系統(tǒng)。該系統(tǒng)可用一個線性隨機(jī)微分方程(Linear Stochastic Difference equation)來描述:
X(k)=A X(k-1)+B U(k)+W(k)
再加上系統(tǒng)的測量值:
Z(k)=H X(k)+V(k)
上兩式子中,X(k)是k時刻的系統(tǒng)狀態(tài),U(k)是k時刻對系統(tǒng)的控制量。A和B是系統(tǒng)參數(shù),對于多模型系統(tǒng),他們?yōu)榫仃嚒?/span>Z(k)是k時刻的測量值,H是測量系統(tǒng)的參數(shù),對于多測量系統(tǒng),H為矩陣。W(k)和V(k)分別表示過程和測量的噪聲。他們被假設(shè)成高斯白噪聲(White Gaussian Noise),他們的covariance 分別是Q,R(這里我們假設(shè)他們不隨系統(tǒng)狀態(tài)變化而變化)。
對于滿足上面的條件(線性隨機(jī)微分系統(tǒng),過程和測量都是高斯白噪聲),卡爾曼濾波器是最優(yōu)的信息處理器。下面我們來用他們結(jié)合他們的covariances 來估算系統(tǒng)的最優(yōu)化輸出(類似上一節(jié)那個溫度的例子)。
首先我們要利用系統(tǒng)的過程模型,來預(yù)測下一狀態(tài)的系統(tǒng)。假設(shè)現(xiàn)在的系統(tǒng)狀態(tài)是k,根據(jù)系統(tǒng)的模型,可以基于系統(tǒng)的上一狀態(tài)而預(yù)測出現(xiàn)在狀態(tài):
X(k|k-1)=A X(k-1|k-1)+B U(k) ……….. (1)
式(1)中,X(k|k-1)是利用上一狀態(tài)預(yù)測的結(jié)果,X(k-1|k-1)是上一狀態(tài)最優(yōu)的結(jié)果,U(k)為現(xiàn)在狀態(tài)的控制量,如果沒有控制量,它可以為0。
到現(xiàn)在為止,我們的系統(tǒng)結(jié)果已經(jīng)更新了,可是,對應(yīng)于X(k|k-1)的covariance還沒更新。我們用P表示covariance:
P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
式(2)中,P(k|k-1)是X(k|k-1)對應(yīng)的covariance,P(k-1|k-1)是X(k-1|k-1)對應(yīng)的covariance,A’表示A的轉(zhuǎn)置矩陣,Q是系統(tǒng)過程的covariance。式子1,2就是卡爾曼濾波器5個公式當(dāng)中的前兩個,也就是對系統(tǒng)的預(yù)測。
現(xiàn)在我們有了現(xiàn)在狀態(tài)的預(yù)測結(jié)果,然后我們再收集現(xiàn)在狀態(tài)的測量值。結(jié)合預(yù)測值和測量值,我們可以得到現(xiàn)在狀態(tài)(k)的最優(yōu)化估算值X(k|k):
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
其中Kg為卡爾曼增益(Kalman Gain):
Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)
到現(xiàn)在為止,我們已經(jīng)得到了k狀態(tài)下最優(yōu)的估算值X(k|k)。但是為了要另卡爾曼濾波器不斷的運行下去直到系統(tǒng)過程結(jié)束,我們還要更新k狀態(tài)下X(k|k)的covariance:
P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)
其中I 為1的矩陣,對于單模型單測量,I=1。當(dāng)系統(tǒng)進(jìn)入k+1狀態(tài)時,P(k|k)就是式子(2)的P(k-1|k-1)。這樣,算法就可以自回歸的運算下去。
卡爾曼濾波器的原理基本描述了,式子1,2,3,4和5就是他的5 個基本公式。根據(jù)這5個公式,可以很容易的實現(xiàn)計算機(jī)的程序
CamShift算法
簡介
CamShift算法,即"Continuously Apative Mean-Shift"算法,是一種運動跟蹤算法。它主要通過視頻圖像中運動物體的顏色信息來達(dá)到跟蹤的目的。我把這個算法分解成三個部分,便于理解:
Back Projection計算。
Mean Shift算法
CamShift算法
1 Back Projection計算
計算Back Projection的步驟是這樣的:
1. 計算被跟蹤目標(biāo)的色彩直方圖。在各種色彩空間中,只有HSI空間(或與HSI類似的色彩空間)中的H分量可以表示顏色信息。所以在具體的計算過程中,首先將其他的色彩空間的值轉(zhuǎn)化到HSI空間,然后會其中的H分量做1D直方圖計算。
2. 根據(jù)獲得的色彩直方圖將原始圖像轉(zhuǎn)化成色彩概率分布圖像,這個過程就被稱作"Back Projection"。
在OpenCV中的直方圖函數(shù)中,包含Back Projection的函數(shù),函數(shù)原型是:
void cvCalcBackProject(IplImage** img, CvArr** backproject, const CvHistogram* hist);
傳遞給這個函數(shù)的參數(shù)有三個:
1. IplImage** img:存放原始圖像,輸入。
2. CvArr** backproject:存放Back Projection結(jié)果,輸出。
3. CvHistogram* hist:存放直方圖,輸入
下面就給出計算Back Projection的OpenCV代碼。
1.準(zhǔn)備一張只包含被跟蹤目標(biāo)的圖片,將色彩空間轉(zhuǎn)化到HSI空間,獲得其中的H分量:
IplImage* target=cvLoadImage("target.bmp",-1); //裝載圖片
IplImage* target_hsv=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
IplImage* target_hue=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
cvCvtColor(target,target_hsv,CV_BGR2HSV); //轉(zhuǎn)化到HSV空間
cvSplit( target_hsv, target_hue, NULL, NULL, NULL ); //獲得H分量
2.計算H分量的直方圖,即1D直方圖:
IplImage* h_plane=cvCreateImage( cvGetSize(target_hsv),IPL_DEPTH_8U,1 );
int hist_size[]={255}; //將H分量的值量化到[0,255]
float* ranges[]={ {0,360} }; //H分量的取值范圍是[0,360)
CvHistogram* hist=cvCreateHist(1, hist_size, ranges, 1);
cvCalcHist(&target_hue, hist, 0, NULL);
在這里需要考慮H分量的取值范圍的問題,H分量的取值范圍是[0,360),這個取值范圍的值不能用一個byte來表示,為了能用一個byte表示,需要將H值做適當(dāng)?shù)牧炕幚?在這里我們將H分量的范圍量化到[0,255].
4.計算Back Projection:
IplImage* rawImage;
//----------------------------------------------
//get from video frame,unsigned byte,one channel
//----------------------------------------------
IplImage* result=cvCreateImage(cvGetSize(rawImage),IPL_DEPTH_8U,1);
cvCalcBackProject(&rawImage,result,hist);
5.結(jié)果:result即為我們需要的.
2) Mean Shift算法
這里來到了CamShift算法,OpenCV實現(xiàn)的第二部分,這一次重點討論Mean Shift算法。
在討論Mean Shift算法之前,首先討論在2D概率分布圖像中,如何計算某個區(qū)域的重心(Mass Center)的問題,重心可以通過以下公式來計算:
1.計算區(qū)域內(nèi)0階矩
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
M00+=I(i,j)
2.區(qū)域內(nèi)1階矩:
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
M10+=i*I(i,j);
M01+=j*I(i,j);
}
3.則Mass Center為:
Xc=M10/M00; Yc=M01/M00
接下來,討論Mean Shift算法的具體步驟,Mean Shift算法可以分為以下4步:
1.選擇窗的大小和初始位置.
2.計算此時窗口內(nèi)的Mass Center.
3.調(diào)整窗口的中心到Mass Center.
4.重復(fù)2和3,直到窗口中心"會聚",即每次窗口移動的距離小于一定的閾值。
在OpenCV中,提供Mean Shift算法的函數(shù),函數(shù)的原型是:
int cvMeanShift(IplImage* imgprob,CvRect windowIn,
CvTermCriteria criteria,CvConnectedComp* out);
需要的參數(shù)為:
1.IplImage* imgprob:2D概率分布圖像,傳入;
2.CvRect windowIn:初始的窗口,傳入;
3.CvTermCriteria criteria:停止迭代的標(biāo)準(zhǔn),傳入;
4.CvConnectedComp* out:查詢結(jié)果,傳出。
(注:構(gòu)造CvTermCriteria變量需要三個參數(shù),一個是類型,另一個是迭代的最大次數(shù),最后一個表示特定的閾值。例如可以這樣構(gòu)造criteria:criteria=cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,10,0.1)。)
返回的參數(shù):
1.int:迭代的次數(shù)。
實現(xiàn)代碼:暫時缺
3) CamShift算法
1.原理
在了解了MeanShift算法以后,我們將MeanShift算法擴(kuò)展到連續(xù)圖像序列(一般都是指視頻圖像序列),這樣就形成了CamShift算法。CamShift算法的全稱是"Continuously Apaptive Mean-SHIFT",它的基本思想是視頻圖像的所有幀作MeanShift運算,并將上一幀的結(jié)果(即Search Window的中心和大小)作為下一幀MeanShift算法的Search Window的初始值,如此迭代下去,就可以實現(xiàn)對目標(biāo)的跟蹤。整個算法的具體步驟分5步:
Step 1:將整個圖像設(shè)為搜尋區(qū)域。
Step 2:初始話Search Window的大小和位置。
Step 3:計算Search Window內(nèi)的彩色概率分布,此區(qū)域的大小比Search Window要稍微大一點。
Step 4:運行MeanShift。獲得Search Window新的位置和大小。
Step 5:在下一幀視頻圖像中,用Step 3獲得的值初始化Search Window的位置和大小。跳轉(zhuǎn)到Step 3繼續(xù)運行。
2.實現(xiàn)
在OpenCV中,有實現(xiàn)CamShift算法的函數(shù),此函數(shù)的原型是:
cvCamShift(IplImage* imgprob, CvRect windowIn,
CvTermCriteria criteria,
CvConnectedComp* out, CvBox2D* box=0);
其中:
imgprob:色彩概率分布圖像。
windowIn:Search Window的初始值。
Criteria:用來判斷搜尋是否停止的一個標(biāo)準(zhǔn)。
out:保存運算結(jié)果,包括新的Search Window的位置和面積。
box:包含被跟蹤物體的最小矩形。
說明:
1.在OpenCV 4.0 beta的目錄中,有CamShift的例子。遺憾的是這個例子目標(biāo)的跟蹤是半自動的,即需要人手工選定一個目標(biāo)。我正在努力嘗試全自動的目標(biāo)跟蹤,希望可以和大家能在這方面與大家交流。
2006.03.15 來自:CSDN 選自Mailbomb 的blog
程序員每天該做的事
1、總結(jié)自己一天任務(wù)的完成情況
最好的方式是寫工作日志,把自己今天完成了什么事情,遇見了什么問題都記錄下來,日后翻看好處多多
2、考慮自己明天應(yīng)該做的主要工作
把明天要做的事情列出來,并按照優(yōu)先級排列,第二天應(yīng)該把自己效率最高的時間分配給最重要的工作
3、考慮自己一天工作中失誤的地方,并想出避免下一次再犯的方法
出錯不要緊,最重要的是不要重復(fù)犯相同的錯誤,那是愚蠢
4、考慮自己一天工作完成的質(zhì)量和效率能否還能提高
一天只提高1%,365天你的效率就能提高多少倍你知道嗎? (1+0.01)^365 = 37 倍
5、看一個有用的新聞網(wǎng)站或讀一張有用的報紙,了解業(yè)界動態(tài)
閉門造車是不行的,了解一下別人都在做什么,對自己能帶來很多啟示
6、記住一位同事的名字及其特點
你認(rèn)識公司的所有同事嗎?你了解他們嗎?
7、清理自己的代碼
今天完成的代碼,把中間的調(diào)試信息,測試代碼清理掉,按照編碼風(fēng)格整理好,注釋都寫好了嗎?
8、清理自己的桌面
當(dāng)日事當(dāng)日畢,保持清潔干勁的桌面才能讓你工作時不分心,程序員特別要把電腦的桌面清理干凈
程序員每月該做的事
1、至少和一個同事一起吃飯或喝茶
不光了解自己工作伙伴的工作,還要了解他們的生活
2、自我考核一次
相對正式地考核自己一下,你對得起這個月的工資嗎?
3、對你的同事考核一次
你的同事表現(xiàn)怎么樣?哪些人值得學(xué)習(xí),哪些人需要幫助?
3、制定下月的計劃,確定下月的工作重點
4、總結(jié)自己工作質(zhì)量改進(jìn)狀況
自己的質(zhì)量提高了多少?
5、有針對性地對一項工作指標(biāo)做深入地分析并得出改進(jìn)的方案
可以是對自己的,也可以是對公司的,一定要深入地分析后拿出自己的觀點來。要想在老板面前說得上話,做的成事,工作上功夫要做足。
6、與老板溝通一次
最好是面對面地溝通,好好表現(xiàn)一下自己,虛心聽取老板的意見,更重要的是要了解老板當(dāng)前關(guān)心的重點
程序員每年該做的事
1、年終總結(jié)
每個公司都會做的事情,但你真正認(rèn)真地總結(jié)過自己嗎?
2、兌現(xiàn)給自己、給家人的承諾
給老婆、兒子的新年禮物買了沒有?給自己的呢?
3、下年度工作規(guī)劃
好好想想自己明年的發(fā)展目標(biāo),爭取升職/加薪、跳槽還是自己出來干?
4、掌握一項新技術(shù)
至少是一項,作為程序員一年要是一項新技術(shù)都學(xué)不到手,那就一定會被淘汰。
掌握可不是看本書就行的,要真正懂得應(yīng)用,最好你能夠?qū)懸黄坛贪l(fā)表到你的blog
5、推出一種新產(chǎn)品
可以是一個真正的產(chǎn)品,也可以只是一個類庫,只要是你創(chuàng)造的東西就行,讓別人使用它,也為世界作點貢獻(xiàn)。當(dāng)然如果真的很有價值,收點注冊費也是應(yīng)該的
6、與父母團(tuán)聚一次
?;丶铱纯?,?;丶铱纯?
OpenCV學(xué)習(xí)筆記(一)概述和系統(tǒng)配置
一、概述
OpenCV是英特爾公司于1999年在俄羅斯設(shè)立的軟件開發(fā)中心“Software Development Center”開發(fā)的。該公司一直致力于基于個人電腦的計算機(jī)視覺應(yīng)用的開發(fā),可以實時追蹤的視覺用戶接口技術(shù)的普及為目標(biāo)。初步擬定應(yīng)用于Human-Computer Interaction(HCI,人機(jī)互動)、物體確定、面孔識別、表情識別,移動物體追蹤、自主運動(Ego-motion)、移動機(jī)器人等領(lǐng)域。因此,“OpenCV 2.1將提供給玩具制造商及機(jī)器人制造商等從事計算機(jī)視覺相關(guān)技術(shù)的各類企業(yè)/團(tuán)體”
OpenCV將以公開源碼的方式提供,也就是接受方有權(quán)在修改之后另行向第三方提供。源代碼(C語言)中包括有庫(Library)的所有功能。詳細(xì)情況刊登在OpenCV的WWW站點上。
英特爾公司解釋說,“速度更高的微處理器、廉價的數(shù)碼相機(jī)以及USB 2等技術(shù)使高速視頻捕獲(Video Capture)成為可能,因此,基于普通個人電腦的實時計算機(jī)視覺將有望實現(xiàn)”。
OpenCV的最新版本為beta5。
二、OpenCV組成部分
目前OpenCV包含下面幾個部分:
cvcore:一些基本函數(shù)(各種數(shù)據(jù)類型的基本運算等)
cv: 圖像處理和計算機(jī)視覺功能(圖像處理,結(jié)構(gòu)分析,運動分析,物體跟蹤,模式識別,攝像機(jī)定標(biāo))
cvaux:一些實驗性的函數(shù)(view morphing,三維跟蹤,pca,hmm)
highgui 用戶交互部分(GUI,圖像視頻I/O,系統(tǒng)調(diào)用函數(shù))
另外還有cvcam,不過linux版本已經(jīng)拋棄。windows版本中將directX支持加入highgui后,cvcam將被徹底去掉。
三、OpenCV特點
OpenCV是Intel公司開發(fā)的圖像處理和計算機(jī)視覺函數(shù)庫,它有以下特點:
1) 開放C源碼
2) 基于Intel處理器指令集開發(fā)的優(yōu)化代碼
3) 統(tǒng)一的結(jié)構(gòu)和功能定義
4) 強大的圖像和矩陣運算能力
5) 方便靈活的用戶接口
6)同時支持MS-WINDOWS、LINUX平臺
四、下載OpenCV
http://www.sourceforge.net/projects/opencvlibrary。
五、參考資料
=》源代碼及文檔下載:SOURCEFORGE.NET
http://sourceforge.net/projects/opencvlibrary/
=》INTEL的OPENCV主頁:
http://www.intel.com/research/mrl/research/opencv/
=》YAHOO OPENCV 的郵件列表:
http://groups.yahoo.com/group/OpenCV/
=》CMU(卡耐基-梅隆大學(xué))的計算機(jī)視覺主頁:
http://www-2.cs.cmu.edu/afs/cs/project/cil/ftp/html/vision.html
=》OPENCV 更為詳細(xì)的介紹
http://www.assuredigit.com//incoming/sourcecode/opencv/chinese_docs/index.htm
=》OPENCV 的常用問題與解答
http://www.assuredigit.com//incoming/sourcecode/opencv/chinese_docs/faq.htm
=》OPENCV 的安裝指南
http://www.assuredigit.com//incoming/sourcecode/opencv/chinese_docs/install
=》更多的最新資料,請訪問
http://blog.csdn.net/hunnish和http://rocee.bokee.com
六、創(chuàng)建一個 DeveloperStudio 項目來開始 OpenCV
1. 在 Developer Studio 中創(chuàng)建新的應(yīng)用程序:
選擇菜單 "File"->"New..."->"Projects" . 選擇 "Win32 Application" 或 "Win32 console application" - 后者是更簡單的方法。
鍵入項目名稱,并且選擇存儲位置
可以為項目創(chuàng)建一個單獨的 workspace ("Create new workspace") , 也可以將新的項目加入到當(dāng)前的 workspace 中 ("Add to current workspace").
單擊 "next"
選擇 "An empty project", 點擊 "Finish", "OK".
經(jīng)過以上步驟,Developer Studio 會創(chuàng)建一個項目目錄 (缺省情況下,目錄名就是項目名), .dsp 文件以及.dsw,.ncb ... ,如果你創(chuàng)建自己的workspace.
2添加文件到 project 中:
選擇菜單"File"->"New..."->"Files" .
選擇"C++ Source File", 鍵入文件名,點擊"OK"
增加 OpenCV 相關(guān)的 頭文件目錄 #include :
#include "cv.h"
/* #inlcude "cvaux.h" // experimental stuff (if need) */
#include "highgui.h"
或者你可以拷貝部分已有的文件 (如:opencv/samples/c/morphology.c) 到項目目錄中,打開它,并且加入到項目中 (右鍵點擊編輯器的視圖 -> "Insert File into Project" -> ).
3配置項目:
選擇菜單"Project"->"Settings..."以激活項目配置對話框 .
在左邊選擇你的項目.
調(diào)節(jié)設(shè)置,對 Release 和 Debug 配置都有效:
選擇 "Settings For:"->"All Configurations"
選擇 "C/C++" tab -> "Preprocessor" category -> "Additional Include Directories:". 加入用逗號分隔的相對路徑 (對文件 .dsp 而言) 或絕對路徑
d:/opencv/cxcore/include,d:/opencv/cv/include,d:/opencv/otherlibs/highgui, d:/opencv/cvaux/include(optionally,)
選擇 "Link" tab -> "Input" category -> "Additional library path:".
加入輸入庫所在的路徑 (cxcore[d].lib cv[d].lib hihghui[d].lib cvaux[d].lib)
d:/opencv/lib
調(diào)節(jié) "Debug" 配置:
選擇 "Settings For:"->"Win32 Debug".
選擇 "Link" tab -> "General" category -> "Object/library modules". 加入空格分隔的 cvd.lib,cxcored.lib highguid.lib,cvauxd.lib (optionally)
可以改變輸出文件的名稱和位置。如想把產(chǎn)生的 .exe 文件放置于項目目錄而不是Debug/ 子目錄下,可在 "Link" tab -> "General" category -> "Output file name:" 中鍵入 ./d.exe
調(diào)節(jié) "Release" 配置
選擇 "Settings For:"->"Win32 Release".
選擇 "Link" tab -> "General" category -> "Object/library modules". 加入空格分隔的cv.lib cxcore.lib highgui.lib cvaux.lib (optionally)
4增加從屬性項目到 workspace 中:
選擇菜單: "Project" -> "Insert project into workspace".
選擇 opencv/cv/make/cv.dsp.
同樣步驟對 opencv/cvaux/make/cvaux.dsp, opencv/otherlibs/highgui/highgui.dsp.
設(shè)置從屬性:
選擇菜單: "Project" -> "Dependencies..."
對 "cv" 選擇 "cxcore",
對 "cvaux" 選擇 "cv", "cxcore",
對 "highgui" 選擇 "cxcore",
對你的項目,選擇所有的: "cxcore", "cv", "cvaux", "highgui".
從屬性配置保證了在源代碼被改變的情況下,自動重新編譯 opencv 庫.
5就這么多。可以編譯并且運行一切了。
七、庫設(shè)置:
靜態(tài)庫設(shè)置:
Opencv程序需要靜態(tài)庫設(shè)置,其release版本的靜態(tài)庫在系統(tǒng)的lib目錄下,其debug版本的靜態(tài)庫需要重新全編譯所有的程序。
動態(tài)庫設(shè)置:
OPenCV啟動時需要一些動態(tài)庫的支持,這些動態(tài)庫必須放在系統(tǒng)目錄下或者當(dāng)前目錄下。
Cv097.dll,cvaux097.dll,cvcam097.dll,cxcore097.dll highguid097.dll,libguide40.dll