OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算
OpenCV學(xué)習(xí)筆記(四十六)——FAST特征點(diǎn)檢測features2D
特征點(diǎn)檢測和匹配是計(jì)算機(jī)視覺中一個(gè)很有用的技術(shù)。在物體檢測,視覺跟蹤,三維常年關(guān)鍵等領(lǐng)域都有很廣泛的應(yīng)用。這一次先介紹特征點(diǎn)檢測的一種方法——FAST(features from accelerated segment test)。很多傳統(tǒng)的算法都很耗時(shí),而且特征點(diǎn)檢測算法只是很多復(fù)雜圖像處理里中的第一步,得不償失。FAST特征點(diǎn)檢測是公認(rèn)的比較快速的特征點(diǎn)檢測方法,只利用周圍像素比較的信息就可以得到特征點(diǎn),簡單,有效。
FAST特征檢測算法來源于corner的定義,這個(gè)定義基于特征點(diǎn)周圍的圖像灰度值,檢測候選特征點(diǎn)周圍一圈的像素值,如果候選點(diǎn)周圍領(lǐng)域內(nèi)有足夠多的像素點(diǎn)與該候選點(diǎn)的灰度值差別夠大,則認(rèn)為該候選點(diǎn)為一個(gè)特征點(diǎn)。
其中I(x)為圓周上任意一點(diǎn)的灰度,I(p)為圓心的灰度,Ed為灰度值差得閾值,如果N大于給定閾值,一般為周圍圓圈點(diǎn)的四分之三,則認(rèn)為p是一個(gè)特征點(diǎn)。
為了獲得更快的結(jié)果,還采用了額外的加速辦法。如果測試了候選點(diǎn)周圍每隔90度角的4個(gè)點(diǎn),應(yīng)該至少有3個(gè)和候選點(diǎn)的灰度值差足夠大,否則則不用再計(jì)算其他點(diǎn),直接認(rèn)為該候選點(diǎn)不是特征點(diǎn)。候選點(diǎn)周圍的圓的選取半徑是一個(gè)很重要的參數(shù),這里我為了簡單高效,采用半徑為3,共有16個(gè)周邊像素需要比較。為了提高比較的效率,通常只使用N個(gè)周邊像素來比較,也就是大家經(jīng)常說的FAST-N。我看很多文獻(xiàn)推薦FAST-9,作者的主頁上有FAST-9、FAST-10、FAST-11、FAST-12,大家使用比較多的是FAST-9和FAST-12。上個(gè)圖說明的更形象一些
OpenCV里對(duì)FAST的使用也非常簡單,先聲明一組特征點(diǎn),構(gòu)建FAST特征檢測,接下來調(diào)用detect函數(shù)檢測圖像中的特征點(diǎn),最后把特征點(diǎn)繪制到圖片上。上代碼說的清楚些
[cpp] view plain copy最后上一張效果圖
OpenCV學(xué)習(xí)筆記(四十七)——VideoWriter生成視頻流highgui?
首先要先糾正個(gè)誤區(qū),我見有人用OpenCV做多媒體開發(fā),真的是很搞笑,OpenCV這東西再強(qiáng)大,這方面也不行的,之所以把視頻讀取寫入這部分做的強(qiáng)大一些,也是為了方便大家做視頻處理的時(shí)候方便些,而且這部分也是基于vfw和ffmpeg二次開發(fā)的,功能還是很弱的。一定要記住一點(diǎn),OpenCV是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺庫,而不是視頻流編碼器或者解碼器。希望大家不要走入這個(gè)誤區(qū),可以把這部分簡單單獨(dú)看待。目前,OpenCV只支持avi的格式,而且生成的視頻文件不能大于2GB,而且不能添加音頻。如果你想突破這些限制,我建議你最好還是看看ffMpeg,而不是浪費(fèi)時(shí)間在OpenCV上。不過也可以利用視頻后期合成工具制作。閑言少敘,進(jìn)入重點(diǎn)VideoWriter類。
這個(gè)類是highgui交互很重要的一個(gè)工具類,可以方便我們?nèi)菀椎膶D片序列保存成視頻文件。類內(nèi)成員函數(shù)有構(gòu)造函數(shù),open,isOpened,write(也可以用<<),使用還是很簡單的。
使用很簡單,先調(diào)用構(gòu)造函數(shù)確定文件的名稱,格式,幀率,幀大小,是否彩色。其中格式作為第二個(gè)參數(shù),OpenCV提供的格式是未經(jīng)過壓縮的,目前支持的格式如下:
CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec
CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codecCV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec?
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec?
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec?
CV_FOURCC('U', '2', '6', '3') = H263 codec?
CV_FOURCC('I', '2', '6', '3') = H263I codec?
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
然后就<<不停的把image傳進(jìn)去就行啦,太簡單了,我都不好意思寫了。上代碼: [cpp] view plain copy
OpenCV學(xué)習(xí)筆記(四十八)——PCA算法實(shí)現(xiàn)core
PCA(principal component analysis,主成分分析),我想是大家用的最多的降維手段,對(duì)于PCA的理解,我想大神們都各有各的絕招,可以應(yīng)用的場合也非常多。下面就介紹一下OpenCV中PCA這個(gè)類,因?yàn)槌S?#xff0c;所以這個(gè)類相對(duì)OpenCV而言顯得比較獨(dú)立,放在了core這部分中。
PCA類的成員函數(shù)包括構(gòu)造函數(shù)、運(yùn)算符重載()、project、backProject這幾個(gè)函數(shù),還包括成員變量eigenvectors、eigenvalues、mean。使用也很方便。比如我要計(jì)算一組向量的PCA,我們只需要定義個(gè)PCA實(shí)例,獲得主成分,調(diào)用project測試新樣本,也可以再調(diào)用backProject重建原始向量,是project的一個(gè)逆運(yùn)算。
在實(shí)際使用我我發(fā)現(xiàn)了一個(gè)bug,構(gòu)造函數(shù)和運(yùn)算符重載()函數(shù)的第三個(gè)參數(shù)只能使用0或者1(分別對(duì)應(yīng)CV_PCA_DATA_AS_ROW和CV_PCA_DATA_AS_COL),但調(diào)用對(duì)應(yīng)的宏卻編譯無法通過,不知道大家是否也是一樣的情況
下面結(jié)合一個(gè)實(shí)例分析:
2001年全國各地區(qū)消費(fèi)情況指數(shù)
地區(qū) 食品X1 衣著X2 家庭設(shè)備X3 醫(yī)療保健X4 交通通信X5 娛樂教育X6 居住X7北京 101.5 100.4 97.0 98.7 100.8 114.2 104.2
天津 100.8 93.5 95.9 100.7 106.7 104.3 106.4
河北 100.8 97.4 98.2 98.2 99.5 103.6 102.4
山西 99.4 96.0 98.2 97.8 99.1 98.3 104.3
內(nèi)蒙古 101.8 97.7 99.0 98.1 98.4 102.0 103.7
遼寧 101.8 96.8 96.4 92.7 99.6 101.3 103.4
吉林 101.3 98.2 99.4 103.7 98.7 101.4 105.3
黑龍江 101.9 100.0 98.4 96.9 102.7 100.3 102.3
上海 100.3 98.9 97.2 97.4 98.1 102.1 102.3
江蘇 99.3 97.7 97.6 101.1 96.8 110.1 100.4
浙江 98.7 98.4 97.0 99.6 95.6 107.2 99.8
安徽 99.7 97.7 98.0 99.3 97.3 104.1 102.7
福建 97.6 96.5 97.6 102.5 97.2 100.6 99.9
江西 98.0 98.4 97.1 100.5 101.4 103.0 99.9
山東 101.1 98.6 98.7 102.4 96.9 108.2 101.7
河南 100.4 98.6 98.0 100.7 99.4 102.4 103.3
湖北 99.3 96.9 94.0 98.1 99.7 109.7 99.2
湖南 98.6 97.4 96.4 99.8 97.4 102.1 100.0
廣東 98.2 98.2 99.4 99.3 99.7 101.5 99.9
廣西 98.5 96.3 97.0 97.7 98.7 112.6 100.4
海南 98.4 99.2 98.1 100.2 98.0 98.2 97.8
重慶 99.2 97.4 95.7 98.9 102.4 114.8 102.6
四川 101.3 97.9 99.2 98.8 105.4 111.9 99.9
貴州 98.5 97.8 94.6 102.4 107.0 115.0 99.5
云南 98.3 96.3 98.5 106.2 92.5 98.6 101.6
西藏 99.3 101.1 99.4 100.1 103.6 98.7 101.3
陜西 99.2 97.3 96.2 99.7 98.2 112.6 100.5
甘肅 100.0 99.9 98.2 98.3 103.6 123.2 102.8
青海 102.2 99.4 96.2 98.6 102.4 115.3 101.2
寧夏 100.1 98.7 97.4 99.8 100.6 112.4 102.5
新疆 104.3 98.7 100.2 116.1 105.2 101.6 102.6?
我們用PCA來分析這些向量的對(duì)消費(fèi)水平的貢獻(xiàn),代碼實(shí)現(xiàn)如下:
[cpp] view plain copy我這里只把前3維的結(jié)果顯示如下:
eigenvalues:[43.18,14.60,9.21]、
eigenvectors:[0.013,0.034,-.0.100, -0.130, 0.207,0.963,-0.020;
? ? 0.157,0.038,0.121,0.893,0.395,0.046,0.060;
? ? 0.214,0.018,-0.001,-0.404,0.813,-0.228,0.277]
OpenCV學(xué)習(xí)筆記(四十九)——號(hào)外!OpenCV-2.4.0 release 千呼萬喚始出來
最近一直很忙,沒有及時(shí)回復(fù)網(wǎng)友的咨詢和疑問,有些回復(fù)也是寥寥數(shù)語。其實(shí)我也沒有辦法,面對(duì)大量的問題,有大部分都是可以通過網(wǎng)絡(luò)和圖書獲得答案,我實(shí)在沒有精力每個(gè)問題都詳細(xì)具體的回答,希望大家諒解,還是一位老師說的好:“知之為知之,不知百度知”。
前陣子有些朋友已經(jīng)發(fā)現(xiàn)了OpenCV-2.4.0beta已經(jīng)放出了,又有重大改動(dòng),很是讓人興奮,我前一篇blog——OpenCV學(xué)習(xí)筆記(三十四)——OpenCV路在何方中提到的OpenCV下一步的改進(jìn)在這次版本中很多都得到了實(shí)現(xiàn)。最讓我欣慰的是OpenCV有了自己的主頁code.opencv.org,之前的http://opencv.willowgarage.com終將退出歷史。其實(shí)這個(gè)beta版我也下載下來看過了,其中的文檔并沒有跟上,所以我一直在等。
五一節(jié)日,OpenCV也給大家送上了大禮,2.4.0release出爐。下載地址還是在Sourceforge上,之前聽說OpenCV要把項(xiàng)目主頁挪到ROS上,看來還沒有實(shí)施。這次的壓縮包竟然有201M啊,有木有啊!可見這次版本添加了很多內(nèi)容啊,由于有重大改動(dòng),接下來還是詳細(xì)給大家說說,其實(shí)新主頁上都有,大家英文好可以去那里看,免得我給翻譯錯(cuò)了~~。還有就是OpenCV許諾大家下一個(gè)版本2.4.1將在五個(gè)月后出爐,看來只能是活到老學(xué)到老了。。。
首先提到的還是網(wǎng)站的事,code.opencv.org現(xiàn)在是OpenCV開發(fā)首要的網(wǎng)站,相信日后的最新消息都會(huì)從這里放出。而opencv.org將作為官網(wǎng)(現(xiàn)在還沒有投入使用,期待一下)。
還有一個(gè)重要的消息是一部分imgproc,?video,?calib3d,?features2d,?objdetect模塊中的函數(shù)將廢棄,扔到legacy中去了。興奮的同時(shí)又讓我很期待,新版本的整合是如何重整這些模塊的呢,看來我又得好好重新學(xué)習(xí)了。版本的重大變化肯定也導(dǎo)致了CMake腳本的改變,這部分不是太精通,這里不班門弄斧。
一個(gè)新的模塊cv::Algorithm出爐。這個(gè)模塊包含了眾多算法,也是接下來研究的重點(diǎn),有新研究再和大家分享,文檔我目前才開始看。
之前被大家詬病的視頻部分這次又有所加強(qiáng),大家經(jīng)常抱怨OpenCV對(duì)視頻支持的不好,不知道這次的改動(dòng)會(huì)不會(huì)打一個(gè)翻身仗,還有待大家實(shí)踐。
feature2d模塊之前使用還是很不方便的,現(xiàn)在都被整合到Algorithm模塊中了。SURF和SIFT被挪到了nonfree模塊,這又是什么模塊,看來新版本的驚喜還不少。。。還有一些函數(shù)的增添和改進(jìn),這里由于沒有使用過,還是不亂講,有興趣自己去看一下咯。
一個(gè)新模塊photo出爐,是為了計(jì)算攝影學(xué)而設(shè)計(jì)的,目前該模塊只有從imgproc中移植出來的inpainting算法,還有一個(gè)模塊是videostab是用來穩(wěn)定視頻的(這個(gè)模塊還是beta版的)?這都是神馬啊!具體咋用我也不知道啊。。。
之前我blog里提到的對(duì)GPU的支持力度要加強(qiáng),OpenCV兌現(xiàn)了它的諾言,把光流法和特征點(diǎn)的提取檢測算法都在GPU模塊中實(shí)現(xiàn)了。之前我提過的android模塊也有所加強(qiáng),但具體就不介紹了,我本身也不是搞移動(dòng)開發(fā)的。新版本還特意提到了一個(gè)函數(shù)getBuildInformation,日后也要試試做啥的。
從今日起,我的學(xué)習(xí)筆記都將使用OpenCV-2.4.0開發(fā),之前的blog都是用2.3.1寫的,肯定有些東西,大家看看就亂了,給大家的學(xué)習(xí)帶來了不便,還請(qǐng)大家包涵理解。
OpenCV學(xué)習(xí)筆記(五十)——Algorithm類介紹(core)
剛開始學(xué)習(xí)新的2.4.0,大概看了一遍使用手冊(cè),還是有些失望的,很多章節(jié)還是2.3.1的內(nèi)容,文檔上的代碼也是漏洞很多。這里就簡單介紹一下Algorithm這個(gè)新的基類。本來以為這部分是一個(gè)新模塊的,看了referenceManual后才知道它只是一個(gè)基類,集成了一些相對(duì)復(fù)雜的算法,比如BM算法等立體匹配算法,前景背景分離的算法,光流法等模塊都集成在其中。類內(nèi)成員函數(shù)主要有get、set、writhe、read、getList、create這些函數(shù)。前4個(gè)是用來從字符串和XML文件中讀取算法的參數(shù)用的,使用get,set要注意參數(shù)的名字對(duì)應(yīng)的類型要和數(shù)據(jù)的類型對(duì)應(yīng),后果大家肯定懂的。有了Algorithm::write,以后SITF::wirte啊SURF::write啊,神馬的都可以再見了。getList可以得到Algorithm支持的算法類型。我測試了一下getList目前getList的算法有:BRIEF、Dense、FAST、CFIT、HARRIS、MSER、ORB、SIFT、STAR、SURF,日后應(yīng)該都會(huì)實(shí)現(xiàn),在手冊(cè)上只有SURF和SIFT的介紹,至少目前,我看來只支持這兩個(gè)算法。create就是創(chuàng)建算法的函數(shù)。使用呢,也相對(duì)簡單。這里還是要說明一下,新版的features2d模塊有較大改動(dòng),反正我看文檔中該部分大多剩下的都是一些公共接口,比如特征描述子、描述子的提取、特征的匹配等。只有FAST、MSER、ORB還在文檔中堅(jiān)挺的出現(xiàn)(估計(jì)日后也要移植走),以前的Star、randomTree、rTreeClassifer神馬該被遺棄的一起,該放ml的去ml,SIFT、SURF啥的也被弄到nonfree這個(gè)新模塊里去了,不過這個(gè)新模塊好弱啊,目前只有SIFT和SURF算法,估計(jì)以后還要把其他的算法整合進(jìn)去。
接下來我就根據(jù)文檔中的一個(gè)示例實(shí)踐一下新版本的SIFT特征點(diǎn)檢測算法,并且對(duì)比下之前版本的SITF的寫法,大家從中感受新結(jié)構(gòu)的不同吧。
注意initModule_<modulename>()函數(shù),這個(gè)函數(shù)要在create前使用,才可以動(dòng)態(tài)的創(chuàng)建算法,不然那個(gè)create的指針很野哦。大家都懂的。如果要使用SURF、SIFT算法,就要調(diào)用inintModule_nonfree(),要使用EM算法,就要先調(diào)用initModule_ml()。
其實(shí)在我看來,這個(gè)Algorithm類更重要的是為開發(fā)者的算法提供一個(gè)公共的接口,以后開發(fā)者開發(fā)的算法,想要增加到OpenCV中去,就按照Algorithm的接口做就OK了,以免以后算法越來越多,我們的OpenCV也要變得臃腫了。
創(chuàng)建自己的算法類現(xiàn)在也很容易了,用Algorithm類做基類,算法的參數(shù)作為成員變量,用get函數(shù)調(diào)用,添加AlgorithmInfo* info() const到自己的算法類中去,添加構(gòu)造函數(shù),AlgorithmInfo變量,可以參考EM算法的初始化看如何操作,添加其他函數(shù)。做好后就用create調(diào)用你自己的函數(shù)就ok啦,這次先簡單介紹,以后有機(jī)會(huì)自己做個(gè)函數(shù)了,體會(huì)深了再詳細(xì)寫出來跟大家分享。
from: http://blog.csdn.net/yang_xian521/article/category/910716
總結(jié)
以上是生活随笔為你收集整理的OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV学习笔记(四十一)——再看基
- 下一篇: OpenCV学习笔记(五十一)——img