OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV學習筆記(二十一)——繪圖函數core?
在圖像中,我們經常想要在圖像中做一些標識記號,這就需要繪圖函數。OpenCV雖然沒有太優秀的GUI,但在繪圖方面還是做得很完整的。這里就介紹一下相關的函數。
在繪圖函數中都會用到顏色,這里用Scalar結構表示顏色參數。
作圖相關的函數有circle、clipLine、ellipse、ellipse2Poly、line、rectangle、polylines、類LineIterator。
填充相關的函數有fillConvexPoly、fillPoly。
顯示文字相關的函數有getTextSize、cvInitFont、putText。
以上這些函數使用都非常簡單方便,我就不過多介紹了。
OpenCV學習筆記(二十二)——粒子濾波跟蹤方法?
粒子濾波法是指通過尋找一組在狀態空間傳播的隨機樣本對概率密度函數進行近似,以樣本均值代替積分運算,從而獲得狀態最小方差分布的過程。
對于粒子濾波跟蹤方法,這里有一篇很淺顯易懂的博客,我分享給大家http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html。他的工作也是參考Rob Hess的程序做的,感謝老外的開源精神,我看了他的程序,我也提出了我的幾點改進,作者本身的設想是想做多目標的運動跟蹤,但函數接口寫的還是有些混亂,以至于最后不能實現(估計是我才疏識淺,沒能領會作者的精神),而且用到了gsl數學庫,這個庫我是不熟悉的,開了一下程序,主要也就只用了里面的隨機數的功能,這功能在新版本的OpenCV里已經集成啦,作者用的數據結構還是老版本的結構,好多函數還是作者自己寫的,我這里用新版本的數據結構重新寫了一遍這個算法,簡化跟蹤目標為一個。下面介紹一下我的設計流程
首先還是將視頻轉換到HSV顏色空間,我發現很多圖像處理的辦法都是在該空間下完成的,Rob Hess對HSV顏色空間的特征提取還是很有意思的,他知道色度和飽和度提供的信息和亮度提供的信息分開考慮,做出了他自己的特征直方圖。我這里用了新版本的calcHist做的特征直方圖,偷了個懶,效果感覺還可以。
初始化階段就是對鼠標選中的目標區域的特征直方圖提取,進入搜索階段,通俗的講,就是在待搜索區域里放入大量的粒子particle,放入粒子的規則有很多,這里使用的是讓粒子的分布為高斯分布,計算每個粒子所在區域的特征直方圖,與目標區域特征進行比較,特征接近的粒子的權重大一些,反之權重小一些。通過調整各粒子的權重大小和樣本位置來近似實際的概率分布,以樣本期望作為系統估計值。然后進行重采樣,重新分布粒子的位置。(對于重采樣的目的,是為了解決序列重要性采樣(SIS)存在的退化現象,即幾步迭代之后,許多粒子的權重變得很小,大量的計算浪費在小權值的粒子上。解決退化問題的一般辦法就是重采樣原理,基本思想就是對后驗概率密度再采樣,保留復制權重大的粒子,剔除權重小的粒子。程序里感覺只是據粒子的權重的后驗概率分布進行一次重新采樣,感覺并不是yangyangcv說的那個類似ransac的意思,因為我對代碼分析并沒有循環放粒子的過程,歡迎大家拍磚)
具體的算法流程為
我的實際編程步驟大概可以分為如下幾步:
// step 1: 提取目標區域特征
// step 2: 初始化particle(粒子的個數很影響跟蹤的速度)
// step 3: 求particle的transition(這一步的參數會很影響粒子的變化區域,需要對不同的跟蹤對象進行調整參數)
// step 4: 求particle區域的特征直方圖(特征選取的不合適也很影響結果)
// step 5: 特征的比對,更新particle權重(特征比較的方法也是影響結果的因素)
// step 6: 歸一化粒子權重
// step 7: resample根據粒子的權重的后驗概率分布重新采樣
// step 8: 計算粒子的期望,作為跟蹤結果
再寫一下我試驗后的心得,我用的是最基本的粒子濾波算法,考慮因素較少,受參數影響很大,而且參數眾多,不方便自動調整。對不同的視頻跟蹤效果差別很大,而且會出現目標丟失的情況。這都是可以改進的。
試驗代碼下載地址為:http://download.csdn.net/detail/yang_xian521/3756240
OpenCV學習筆記(二十三)——OpenCV的GUI之鳳凰涅槃Qt?
OpenCV的發展趨勢真是越來越向Linux方向發展,對Windows平臺的支持越來越少,2.2版本之后把CvvImage也給刪除了,這讓人如何開發MFC程序啊,網上搜了好久,基本的辦法都是調用之前版本的代碼,繼續使用CvvImage,這樣會導致一個很嚴重的問題,就是程序里顯示的所有的圖片都必須是CvvImage類,不能用MFC的圖片顯示方法,這就需要對代碼進行大量的修改,不符合開發的要求。感覺大家的辦法都是治標不治本,而且MFC也是快要被日新月異的新技術拍在沙灘上的東西。 我總不能永遠在控制臺下面開發OpenCV應用程序吧。看了一下OpenCV的用戶手冊,發現它支持跨平臺的Qt這個UI開發框架。Qt是諾基亞開發的一個跨平臺的C++圖形用戶界面應用程序框架,我索性也學習一下。Qt的安裝我參考的是這篇文章http://blog.sina.com.cn/s/blog_661159d50100ib38.html,文章里介紹的方案也是我的開發環境VS2008,想必對于配置OpenCV相當熟練的大牛們,配置Qt肯定也難不倒各位。安裝好后,就是進行OpenCV的GUI開發咯從上圖中我們可以看出Qt對OpenCV的支持還是很好的,需要用到的開發工具為Qt*GUI,這個GUI可以提供狀態欄、工具欄和控制面板。控制面板上面可以制作進度條河按鈕等控件(使用trackbar,要確保窗口的參數為NULL;使用buttonbar之前,要先創建一個按鈕)。相關的函數有setWindowProperty、getWindowProperty、fontQt、addText、displayOverlay、displayStatusBar、createOpenGLCallback、saveWindowParameters、loadWindowParameters、createButton。由于Qt我也是剛接觸,對這些函數的理解和新收獲,我會陸續補充在這篇文章里。
OpenCV學習筆記(二十四)——初探機器學習庫ml?
這部分內容應該是OpenCV高深精髓的一部分。給OpenCV插上了翅膀,可以使它實現更強大的功能,而不是簡單的做一些基本的圖像處理。文采太差,就不描繪machine learning的強大了。直接剖析之。
大部分的分類器和識別的算法都封裝在了c++的類中。有些類有一些共同的基礎,都被定義在CvStatModel類中了。
那就先介紹這個統計模型類CvStatModel,它是機器學習統計模型的基礎類,其包括了構造函數和析構函數,清除內存重置模型狀態的clear函數(功能類似析構函數,但可以重用,在析構函數里也調用該函數),模型保存 / 加載XML文件的save / load函數,讀寫文件和模型的函數write / read,訓練模型的函數train,預測樣本結果predict函數。
普通的貝葉斯分類器CvNormalBayesClassifier,有train和predict函數
k近鄰算法CvKNearest,有train、find_nearest、get_max_k、get_var_count、get_sample_count、is_regression函數
支持向量機SVM相關的有類CvParamGrid用來表示統計參數范圍的對數格子,類CvSVMParams、類CvSVM
決策樹類CvDTreeSplit、CvDTreeNode、CvDTreeParams、CvDTreeTrainData、CvDTree
Boosting算法相關類CvBoostParams、CvBoostTree、CvBoost
Gradient Boosted Trees(GBT)算法相關類CvGBTreesParams、CvGBTrees
隨機森林相關算法類CvRTparams、CvRTrees
隨機樹算法的擴展類CvERTrees
期望最大EM算法相關類CvEMParams、CvEM
神經網絡算法相關類CvANN_MLP_TrainParams、CvANN_MLP
OpenCV果然夠強大,幾乎囊括了目前比較流行的全部機器學習方面的經典算法。以上這些牛叉的算法我都好膜拜啊,得下苦功專研了。
記得哪位牛人說過algorithm is king,data is queen。有了算法還需要對應的數據類CvMLData、CvTrainTestSplit
這部分內容真是博大精深啊,作為初學者,我一直不太敢寫這方面的博客,很多算法只知道個皮毛,沒有實現過,更不知道其中的奧妙,這里只能先做個介紹,待我日后慢慢豐富內容
OpenCV學習筆記(二十五)——OpenCV圖形界面設計Qt+VS2008
一直對MFC對OpenCV的支持不好而耿耿于懷,了解了Qt對OpenCV支持很好,但網上這方面的資料很少。大部分的圖形交互的設計都是基于OpenCV2.0之前的數據結構lpImage進行的。最近得到了一本好書《OpenCV 2 Computer Vision Application Programming Cookbook》,下載的鏈接為http://ishare.iask.sina.com.cn/f/20485520.html?retcode=0,2011年5月出版,全書都是基于OpenCV2.2版本的實現,采用了新的數據結構。我這里強烈建議利用C++開發的朋友們不要再使用老版本的數據結構了,實在影響開發效率。至于大家最熟悉的參考書《learning OpenCV》和《OpenCV教程——基礎篇》這兩本廣為流傳的書,我的看法是已經遠遠不能滿足OpenCV新版本的學習了。真的希望這本新書的中文版盡快出爐。
參考這本書的利用Qt創建GUI,不過書中的辦法是在Qt Creator下實現的,我這里通過VS2008+Qt實現。下面結合一個例程介紹一下如何在Qt的GUI環境下開發OpenCV。
先新建工程Qt Project --> Qt Application,點擊finish完成工程的創建。然后在項目屬性里的連接器的附加依賴項里面添加opencv的lib文件。工程創建好之后,一個后綴名為.ui的文件就是關于界面設計的。首先創建兩個按鈕,拖拽兩個Push Buttons到Form中去,修改其屬性,一個名字為Open Image,一個為Process。右鍵按鈕選擇connect signal為其添加響應函數,選擇clicked()。對應的cpp文件多出了on_OpenImage_clicked函數,代碼如下:
[cpp]?view plain?copy
接下來要在對應的頭文件中添加顯示圖片的必要代碼,添加QFileDialog類的聲明,OpenCV必要的include頭文件包含,在類中聲明一個cv :: Mat成員變量。代碼如下:
[cpp]?view plain?copy
接下來添加on_OpenImage_clicked的函數內容。代碼如下:
[cpp]?view plain?copy
類似的辦法添加Process按鈕的相應代碼:
[cpp]?view plain?copy
這樣就可以實現一個普通的按鈕響應。但我們的目的是將圖片顯示在對話框form中,這還需要進一步深入學習。與MFC中顯示圖片需要CvvImage類似,要想在Qt的Form中顯示圖片,圖片的格式也必須為QImage,需要將cv::Mat的BGR通道順序變換為RGBA,QImage的格式為Format_RGB32,調用cvtColor實現(這里例程里調用的為BGR2RGB,然后QImage的格式為Format_RGB888,但我試驗顯示結果是有問題的,故自己調整了一下)。(后經實驗,BGR2RGB,Format_RGB888這組參數對于webcam視頻是正確的,對于我當時的實驗照片是不正確的,格式的問題真是混亂!!!)實現代碼如下:
[cpp]?view plain?copy
注意打開圖片的路徑不要有中文,最后的顯示結果為
相關代碼的下載地址為http://download.csdn.net/detail/yang_xian521/3793960
from: http://blog.csdn.net/yang_xian521/article/category/910716
總結
以上是生活随笔為你收集整理的OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV学习笔记(十六)——CamS
- 下一篇: OpenCV学习笔记(二十六)——小试S