http://blog.csdn.net/thefutureisour
之前看到過C版本的,感覺寫的很長,沒有仔細(xì)看,但是C++版本的寫的還是很不錯(cuò)的。我仔細(xì)看了一下,并對內(nèi)容進(jìn)行了仔細(xì)的注釋,如果有人沒有看懂,歡迎留言討論。
先看一眼頭文件,在background_segm.hpp中 class CV_EXPORTS_W
BackgroundSubtractorMOG : public BackgroundSubtractor { public:
/...
最近在寫自己的算法,其實(shí)就是對一些傳統(tǒng)算法的改進(jìn)。傳統(tǒng)算法可以參考o(jì)pecv的源代碼。在閱讀源代碼的過程中,我慢慢領(lǐng)會到了opencv的強(qiáng)大之處,并不是因?yàn)樗鼘?shí)現(xiàn)了各種算法,而是在于它對于基本數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),是得其他人可以很方便的使用這些數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)自己的算法。在幫助手冊中,已經(jīng)對于這些數(shù)據(jù)結(jié)構(gòu)有比較詳細(xì)的描述了。今天我就為英語不好的孩子們服務(wù)一下,簡單的介紹一下它們。
首先介紹2維點(diǎn)...
看上去這是一個(gè)比較簡單的問題,在2.0以上的版本中,使用Mat類來儲存一幅圖像。但是具體的說,Mat類中,又是如何儲存的呢?
在opencv自帶的幫助手冊上有這么一段話:
通過這兩個(gè)式子,我們可以略知一二:首先,Mat不僅可以存圖像,也可以用來存放其他高維的數(shù)據(jù)。數(shù)據(jù)存在data指針?biāo)赶虻牡刂分械?,對于高維數(shù)據(jù)(dim維),每個(gè)數(shù)據(jù)的地址是用上面式子算的;它的一個(gè)特例是2維數(shù)...
其實(shí)按理說這并不是一件困難的工作,但是由于種種原因,在OpenCV中讀取的黑白圖像并不是我們想像的只有一個(gè)通道,而是3通道的。但是當(dāng)我們使用Mat
image =
imread("D:/picture/images/baboon2.jpg",0);之后,不論是彩色圖像還是黑白圖像都會轉(zhuǎn)換為單通道。明白了這個(gè)之后,我們的程序就簡單了:
#include #include #include u...
我之前的OpenCV的學(xué)習(xí),都是C++的,主要的參數(shù)資料是用戶手冊和一本書《OpenCV 2 Computer Vision
Application Programming
Cookbook》(網(wǎng)上可以下載到,但是沒有中文版),這本書的前七章的主要內(nèi)容我基本都放到了博客上。(后面的內(nèi)容有時(shí)間在與大家繼續(xù)分享。)這本書最大的特點(diǎn)是通俗易懂—因?yàn)樗且槐尽癈ookbook”。對很多理論性的內(nèi)容,都是淺...
先看提取輪廓的代碼: Mat image =
imread("D:/picture/images/binaryGroup.bmp",0); if(!image.data)
return -1; imshow("源圖像",image); //獲取輪廓 std::vector> contours;
//獲取輪廓: findContours(image, //圖...
檢測輪廓時(shí)我們使用canny邊沿檢測算法,這個(gè)算法其實(shí)也是基于梯度的。但是,與傳統(tǒng)的梯度算法求邊沿不同的是:
1.它可以精確的定位邊沿的位置。通過沿幅角方向檢測模值的極大值點(diǎn),即邊緣點(diǎn),遍歷8個(gè)方向圖像像素,把每個(gè)像素偏導(dǎo)值與相鄰像素的模值比較,取其MAX值為邊緣點(diǎn),置像素灰度值為0。這樣做的結(jié)果使得邊沿非常細(xì)。
2.雙閾值檢測。通常一個(gè)較小的閾值會保留很多邊沿,他們中的一部分是沒有用的;而一...
Sobel變換和拉普拉斯變換都是高通濾波器。什么是高通濾波器呢?就是保留圖像的高頻分量(變化劇烈的部分),抑制圖像的低頻分量(變化緩慢的部分)。而圖像變化劇烈的部分,往往反應(yīng)的就是圖像的邊沿信息了。
在OpenCV中,調(diào)用sobel函數(shù)很簡單: Mat image =
imread("D:/picture/images/boldt.jpg",0); if(!image.data)
re...
首先如何理解對灰度圖像進(jìn)行形態(tài)學(xué)操作?
一種比較形象的方法是將灰度圖像看做是“等高線”:亮的區(qū)域代表山峰,而暗的區(qū)域代表山谷,圖像的邊沿就對應(yīng)于峭壁。如果腐蝕一幅圖像,會導(dǎo)致山谷被擴(kuò)展,而峭壁減少了。相反的,如果膨脹一幅圖像,峭壁則會增加。但是這兩種情況下,中間的部分(大片的谷底和高原)基本保持不變。
在上述理解的基礎(chǔ)上,如果我們對圖像的腐蝕和膨脹的結(jié)果做差,就能提取圖像的邊界:因?yàn)檫吔鐓^(qū)域,...
這次主要介紹兩方面的內(nèi)容,一部分是形態(tài)學(xué)操作,另一部分是工具條。
先說形態(tài)學(xué)操作。這里只介紹4種簡單的:腐蝕、膨脹、開、閉。最基本的形態(tài)學(xué)操作是腐蝕和膨脹。其他的操作可以通過腐蝕和膨脹推導(dǎo)出來。
用集合論的觀點(diǎn)介紹他們非常麻煩。這里換一種思路:我們先做一定的假設(shè):對于一幅圖像:前景(我們感興趣的部分)是白色的;背景(不感興趣的部分)是黑色的。然后就可以望文生義一下了:腐蝕操作會使得前景變小,而...
什么是反向投影直方圖呢?簡單的說在灰度圖像的每個(gè)點(diǎn)(x,y),用它對應(yīng)的直方圖的bin的值(就是有多少像素落在bin內(nèi))來代替它。所以·如果這個(gè)bin的值比較大,那么反向投影顯示的結(jié)果會比較亮,否則就比較暗。
從統(tǒng)計(jì)學(xué)的角度,反輸出圖像象素點(diǎn)的值是觀測數(shù)組在某個(gè)分布(直方圖)下的的概率。
所以加入我們已經(jīng)得到了一個(gè)物體的直方圖,我們可以計(jì)算它在另一幅圖像中的反向投影,來判斷這幅圖像中是否有該物...
我們知道,直方圖可以在一定程度上反應(yīng)圖像的一些統(tǒng)計(jì)信息。所以,可以考慮用直方圖對比的方法,進(jìn)行基于內(nèi)容的圖像檢索。
通常我們搜索圖片,都是根據(jù)圖片的標(biāo)簽搜索的。基于內(nèi)容的搜索,就是假設(shè)我們不知道標(biāo)簽,而是直接輸入一幅圖像,然后從得出一些跟這幅圖像的直方圖比較相似的圖像。
那么我們不禁要問,如何度量兩幅直方圖的相似程度呢?
OpenCV的compareHist函數(shù)提供了一個(gè)參數(shù)供你選擇。最簡單...
一些頭文件: #include #include #include
#include using namespace std; using namespace cv;
這次通過一個(gè)讀取視頻的綜合例子來介紹VideoCapture類的一些基本操作: #include #include #include
#include using namespace std; using namespace cv; int main() {
//打開視頻文件:其實(shí)就是建立一個(gè)VideoCapture結(jié)構(gòu) VideoCapture
capture("D:/vide...
在網(wǎng)上看了許多關(guān)于OpenCV啟動攝像頭的資料,但是,都是基于C語言的,代碼又臭又長,(其實(shí)主要是因?yàn)槲覍W(xué)的OpenCV就是用C++的,C語言的基本數(shù)據(jù)結(jié)構(gòu)不太熟悉),所以一直想找一個(gè)用C++寫的程序,最后讓我在OpenCV自帶的英文參考手冊上找見了,整個(gè)代碼30行都不到!nice??!我對代碼做了一點(diǎn)修改,發(fā)上來吧!
#include #include #include using na...
銳化的作用是加強(qiáng)圖像的邊沿和輪廓,通常也成為高通濾波器:
模板一般設(shè)計(jì)為中心處的值為正,外圍的值為負(fù)(總系數(shù)之和為0): int main() { //源圖像 Mat scr =
imread("D:/picture/img.tif"); Mat rst; imshow("原圖像",scr); Mat
kernel(3,3,CV_32F,Scalar(-1)); // 分配像素...
中值濾波就是將當(dāng)前像素值替換為模板覆蓋范圍內(nèi)的所有像素值中大小居中那一個(gè):對于一個(gè)3*3的模板,第5大的就是中值:
(10,15,20,20,20,20,20,25,100)
中值濾波使得那些更亮(或者更暗)的點(diǎn)更像他周圍的值。所以它在濾除噪音的同時(shí),可以較好地保留細(xì)節(jié)輪廓。
為了驗(yàn)證上述結(jié)論,我先給一幅圖像加入椒鹽噪聲,然后用分別用中值濾波、均值濾波處理圖像,進(jìn)行對比: #include...
空域?yàn)V波按照對像素的操作方法,可以分為兩類:線性濾波(低通、高通、帶通)和非線性濾波(最大值、最小值、中值)
按照圖像處理的效果,可以分為平滑濾波和銳化濾波。
“線性濾波”這個(gè)概念其實(shí)是從信號與系統(tǒng)里面借用過來的。輸入信號通過一個(gè)線性系統(tǒng)時(shí),輸出的結(jié)果是輸入信號與系統(tǒng)時(shí)域沖擊響應(yīng)的卷積。而在圖像處理中,則使用模板對像素(及其周圍像素)進(jìn)行線型加權(quán)運(yùn)算,權(quán)值取決于模板的像素值。運(yùn)算方法與卷積類似...
OpenCV提供了一些基本的繪圖操作,比如畫圓,畫橢圓,畫線,畫矩形,在圖像里插入文字等功能。
畫圓使用的是circle函數(shù),必須提供的參數(shù)是:畫在出的圓顯示在哪里,圓心,半徑,以及畫線的顏色。 //圓心 Point center
= Point(255,255); //半徑 int r = 100; //承載圖像 Mat
picture(500,500,CV_8UC3,Scala...
SVM是2000年左右提出的一種新的分類方法,著重解決了小樣本分類問題。具體原理可以參看模式識別的書籍。OpenCV中的SVM的實(shí)現(xiàn)也是基于大名鼎鼎的SVM
庫:http://www.csie./~cjlin。OpenCV教程中有兩個(gè)例子,一個(gè)是線性可分的,一個(gè)是線性不可分的,我對他們做了詳盡的注釋:
先看線性可分時(shí): #include #include #includ...
我的OpenCV學(xué)習(xí)筆記(五):給圖像加上邊框
這段程序來自O(shè)penCV教程,使用copyMakeBorder函數(shù)來給圖像加上邊框: #include #include
#include #include using namespace std; using namespace cv; int
main() { Mat image,result; //獲得邊界的類型 int borderT...
當(dāng)兩幅圖像尺寸相同時(shí),給圖像加上水印效果其實(shí)很簡單,就是簡單的將一幅圖像加到另一幅圖像上(兩幅圖像乘以一定的系數(shù)就可以控制相加的效果):
#include #include using namespace cv; int main() { Mat image1 =
imread("D:/picture/images/boldt.jpg"); Mat image2 = imre...
在第二講中,我介紹了如何操作每個(gè)像素,這次利用操作像素完成簡單的圖像處理操作。
首先從給圖像加入椒鹽噪聲開始,椒鹽噪聲其實(shí)就是使圖像的一些隨機(jī)的像素為黑色(255)或者白色(0): #include
#include using namespace cv; void salt(Mat& image, int n) {
for(int k=0; k
首先推薦一本書:《OpenCV 2 Computer Vision
Application Programming
Cookbook》網(wǎng)上可以下載到這本書的英文版,貌似沒有翻譯的。這本書的特點(diǎn)是里面的程序不是那種為了演示函數(shù)功能而寫的面向過程的小程序,而是用面向?qū)ο蟮乃悸穼懙拇蟪绦?,不過他是一步一步教你寫出來的,也不要有太大壓力。
任何圖像處理算法,都是從操作每個(gè)像素開始的。即使你不會使用Ope...
OpenCV是一個(gè)很不錯(cuò)的開源計(jì)算機(jī)視覺庫。我自己已經(jīng)玩了一段時(shí)間了,決定把一些學(xué)習(xí)成果整理出來,分享給大家。學(xué)習(xí)OpenCV最好的助手當(dāng)然是opencv自帶的手冊和教程了。手冊是英文版的,方便查找函數(shù)。教程有部分是中文版的,也有一部分沒有漢化??梢酝ㄟ^網(wǎng)址:http://www./opencvdoc/2.3.2/html/index.html查看。
這次主要是想說一個(gè)...
|
|