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