OpenCV学习笔记(一)(二)(三)(四)(五)
OpenCV學(xué)習(xí)筆記(一)
決心開(kāi)始研究OpenCV。閑言少敘,sourceforge網(wǎng)站最近的版本是2011年8月的OpenCV2.3.1,下載安裝,我這里使用的開(kāi)發(fā)環(huán)境是vs2008,網(wǎng)上搜了一下配置的教程,與之前的幾個(gè)OpenCV版本的配置過(guò)程大體相同:(教程網(wǎng)上很多,知之為知之,不知百度之,我這里粗略再講一下)
1. 配置電腦的環(huán)境變量(Path變量)這里我的是D:\Program Files\OpenCV2.3.1\build\x86\vc9\bin(需要注銷(xiāo)才能生效),這里需要注意網(wǎng)上的教程又讓增加一個(gè)OPENCV變量,值為D:\Program Files\OpenCV2.3.1\build(你安裝的路徑中的build目錄)
2. 添加包含文件和庫(kù)文件,這個(gè)和前幾個(gè)版本方法類(lèi)似,都是去工具->選項(xiàng)->VC目錄添加build目錄下的include目錄及其子目錄和你電腦對(duì)應(yīng)版本的lib目錄(選擇x86 or x64,vc9 ?or vc10)
下面是第一個(gè)實(shí)例:
新建一個(gè)空項(xiàng)目,添加源文件如下:
[cpp]?view plain?copy
這段程序可以在你安裝目錄下的samples\cpp\tutorial_code\introduction\display_image找到,編譯后,將圖片test.jpg放到opencvtest.exe相同的目錄中去,利用cmd命令行進(jìn)入的可執(zhí)行文件所在的目錄,
運(yùn)行opencvtest test.jpg
則會(huì)顯示一個(gè)圖片,第一個(gè)程序成功。如圖
如果遇到找不到tbb_debug.dll文件的問(wèn)題,參考這里http://www.opencv.org.cn/forum/viewtopic.php?p=52223,只是我的環(huán)境是vs2008,大同小異。祝你成功!(PS:后來(lái)我發(fā)現(xiàn)這不是最好的處理辦法,最好的處理辦法是在Path路徑里添加環(huán)境變量D:\Program Files\OpenCV2.3.1\build\common\tbb\ia32\vc9)
接下來(lái)我覺(jué)得應(yīng)該好好研究一下OpenCV里的doc文件夾下的教程和使用手冊(cè),我個(gè)人覺(jué)得《學(xué)習(xí)OpenCV》這本書(shū)已經(jīng)遠(yuǎn)遠(yuǎn)跟不上OpenCV發(fā)展的速度了
OpenCV學(xué)習(xí)筆記(二)
還是老話題,2.2版本對(duì)OpenCV可是進(jìn)行了大刀闊斧的改革,用c++重新了大部分結(jié)構(gòu),而不是1.X版本中的c結(jié)構(gòu)。這些模塊包括:
core——定義了基本數(shù)據(jù)結(jié)構(gòu),包括最重要的Mat和一些其他的模塊
imgproc——該模塊包括了線性和非線性的圖像濾波,圖像的幾何變換,顏色空間轉(zhuǎn)換,直方圖處理等等
video——該模塊包括運(yùn)動(dòng)估計(jì),背景分離,對(duì)象跟蹤
calib3d——基本的多視角幾何算法,單個(gè)立體攝像頭標(biāo)定,物體姿態(tài)估計(jì),立體相似性算法,3D信息的重建
features2d——顯著特征檢測(cè),描述,特征匹配
objdetect——物體檢測(cè)和預(yù)定義好的分類(lèi)器實(shí)例(比如人臉,眼睛,面部,人,車(chē)輛等等)
highgui——視頻捕捉、圖像和視頻的編碼解碼、圖形交互界面的接口
gpu——利用GPU對(duì)OpenCV模塊進(jìn)行加速算法
ml——機(jī)器學(xué)習(xí)模塊(SVM,決策樹(shù),Boosting等等)
flann——Fast Library for Approximate Nearest Neighbors(FLANN)算法庫(kù)
legacy——一些已經(jīng)廢棄的代碼庫(kù),保留下來(lái)作為向下兼容
還有一些其他的模塊,比如FLANN算法庫(kù)、Google測(cè)試包、Python bingdings等等。
OpenCV學(xué)習(xí)筆記(三)
自從版本2.0,OpenCV采用了新的數(shù)據(jù)結(jié)構(gòu),用Mat類(lèi)結(jié)構(gòu)取代了之前用extended C寫(xiě)的cvMat和lplImage,更加好用啦,最大的好處就是更加方便的進(jìn)行內(nèi)存管理,對(duì)寫(xiě)更大的程序是很好的消息。
需要注意的幾點(diǎn):1. Mat的拷貝只是復(fù)制了Mat的信息頭,數(shù)據(jù)的指針也指向了被拷貝的數(shù)據(jù)地址,而沒(méi)有真正新建一塊內(nèi)存來(lái)存放新的矩陣內(nèi)容。這樣帶來(lái)的一個(gè)問(wèn)題就是對(duì)其中一個(gè)Mat的數(shù)據(jù)操作就會(huì)對(duì)其他指向同一塊數(shù)據(jù)的Mat產(chǎn)生災(zāi)難性的影響。
2.建立多維數(shù)組的格式是這樣的[cpp]?view plain?copy
3.傳統(tǒng)的lplImage格式也可直接轉(zhuǎn)換為Mat格式
[cpp]?view plain?copy
如果想將新版本的Mat格式轉(zhuǎn)換為老版本,則需要如下調(diào)用:
[cpp]?view plain?copy
不過(guò)更安全的調(diào)用格式為:
[cpp]?view plain?copy
4.Mat結(jié)構(gòu)更加友好,很多操作更接近matlab的風(fēng)格
5.也有Point2f,Point3f,vector等數(shù)據(jù)結(jié)構(gòu)可以使用
6.RNG類(lèi)可以產(chǎn)生隨機(jī)數(shù)
7.實(shí)現(xiàn)顏色通道的分離使用函數(shù)split
OpenCV學(xué)習(xí)筆記(四)
2.0新版本對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行了大幅修改:
定義了DataType類(lèi)
定義了Point_模板類(lèi),取代了之前版本的CvPoint、CvPoint2D32f
定義了Point3_模板類(lèi),取代了之前版本的CvPoint2D32f
定義了Size_模板類(lèi),取代了之前版本的CvSize和CvSize2D32f
定義了Rect_模板類(lèi),取代了之前版本的CvRect
RotatedRect模板類(lèi),
TermCriteria模板類(lèi),取代了之前的CvTermCriteria,這個(gè)類(lèi)是作為迭代算法的終止條件的,這個(gè)類(lèi)在參考手冊(cè)里介紹的很簡(jiǎn)單,我查了些資料,這里介紹一下。該類(lèi)變量需要3個(gè)參數(shù),一個(gè)是類(lèi)型,第二個(gè)參數(shù)為迭代的最大次數(shù),最后一個(gè)是特定的閾值。類(lèi)型有CV_TERMCRIT_ITER、CV_TERMCRIT_EPS、CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,分別代表著迭代終止條件為達(dá)到最大迭代次數(shù)終止,迭代到閾值終止,或者兩者都作為迭代終止條件。以上的宏對(duì)應(yīng)的c++的版本分別為TermCriteria::COUNT、TermCriteria::EPS,這里的COUNT也可以寫(xiě)成MAX_ITER。
Matx模板類(lèi)。Matx模板類(lèi)是對(duì)Mat類(lèi)的一個(gè)拓展,從Matx類(lèi)有派生出Vec類(lèi),又Vec類(lèi)又派生出Scalar_類(lèi),取代了CvScalar
定義了Range類(lèi)指定了一個(gè)序列的一個(gè)連續(xù)的子序列
定義了Ptr類(lèi)用來(lái)對(duì)老版本的數(shù)據(jù)結(jié)構(gòu)進(jìn)行指針操作,更安全有效,可以防止內(nèi)存的不正常使用。
最最重要的定義了Mat類(lèi)來(lái)表示矩陣,取代了之前的CvMat和lplImage。Mat結(jié)構(gòu)支持的操作有:
構(gòu)造析構(gòu)函數(shù)Mat和~Mat
對(duì)=、MatExpr、( )、CvMat、IplImage進(jìn)行了運(yùn)算符重載
row、col函數(shù)
rowRange、colRange
類(lèi)似matlab的運(yùn)算操作diag、t、inv、mul、cross、dot、zeros、one、eye
復(fù)制轉(zhuǎn)換變形clone、copyTo、convertTo、assignTo、setTo、reshape、create、addref
其中copyTo函數(shù)有個(gè)妙用,不但可以復(fù)制Mat,還可以通過(guò)mask提取出感興趣的部分
數(shù)據(jù)的操作release、resize、reserve、push_back、pop_back、locateROI、adjustROI
Mat的信息total、isContinuous、elemSize、elemSize1、type、depth、channes、step1、size、empty
其中step1函數(shù)返回Mat結(jié)構(gòu)每一行的字節(jié)數(shù)=列數(shù)*通道數(shù),更方便用指針定位特定元素
定位ptr、at、begin、end
還做了幾個(gè)擴(kuò)展類(lèi)Mat_、NAryMatlterator、SparseMat、SparseMat_取代了之前的CvSparseMat。這些類(lèi)的操作運(yùn)算與Mat大同小異,類(lèi)聲明參考core的具體頭文件
當(dāng)然,新版本對(duì)老版本的數(shù)據(jù)結(jié)構(gòu)和函數(shù)依然支持。
新版本還在這些結(jié)構(gòu)里支持dft、dct變換,我這里講一下我的新發(fā)現(xiàn)PCA類(lèi)、SVD類(lèi)
PCA類(lèi)有構(gòu)造函數(shù)PCA,運(yùn)算符重載(),project,backProject。SVD類(lèi)有構(gòu)造函數(shù)SVD,運(yùn)算符重載(),compute,solveZ,backSubst
這里介紹幾個(gè)我使用過(guò)的實(shí)用函數(shù):
inRange函數(shù)可以檢查Matsrc的內(nèi)容是否在Matlower、Matupper之間,輸出結(jié)果是一個(gè)uchar型矩陣,1表示在兩者之間,否則為0,值得注意的是,Matlower,Matupper也可以用Scalar的格式
bitwise_xxx函數(shù)對(duì)兩個(gè)矩陣進(jìn)行位運(yùn)算,結(jié)果保存在第三個(gè)矩陣當(dāng)中
mixChannels函數(shù)可以實(shí)現(xiàn)矩陣的指定通道復(fù)制到新矩陣的指定通道
總之,新版本支持更多的數(shù)學(xué)運(yùn)算,還支持一些畫(huà)圖操作
OpenCV學(xué)習(xí)筆記(五)
都知道,2.0版本對(duì)之前的OpenCV數(shù)據(jù)結(jié)構(gòu)進(jìn)行了大幅度的修改。但對(duì)之前版本的兼容是一個(gè)很重要的事情。這節(jié)就主要討論這個(gè)問(wèn)題
首先來(lái)看一下2.0版本對(duì)之前版本的進(jìn)行了哪些修改
1.采用了新的數(shù)據(jù)結(jié)構(gòu)Mat作為圖像的容器,取代了之前的CvMat和lplImage,這個(gè)改動(dòng)不是太復(fù)雜,只需適應(yīng)一下新東西,而且可以自由轉(zhuǎn)換
對(duì)于指針的操作要相對(duì)復(fù)雜一些,而且還要注意內(nèi)存的釋放,我這里不推薦用老版本的數(shù)據(jù)結(jié)構(gòu),例如:
[cpp]?view plain?copy
2.對(duì)library進(jìn)行了重組,將原來(lái)的一個(gè)大庫(kù)根據(jù)功能結(jié)構(gòu)分成具體小庫(kù),這樣包含頭文件的時(shí)候只需要加入你需要的庫(kù),只是原來(lái)庫(kù)的子集
3.使用了cv 這個(gè)namespace來(lái)防止和其他的library 結(jié)構(gòu)沖突。所以在使用的時(shí)候也要預(yù)先加上cv::關(guān)鍵字,這也是新版本的函數(shù),數(shù)據(jù)都省略了cv前綴的原因,一般放在include之后,格式為:
[cpp]?view plain?copy
from: http://blog.csdn.net/yang_xian521/article/category/910716
總結(jié)
以上是生活随笔為你收集整理的OpenCV学习笔记(一)(二)(三)(四)(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用 Sublime + PlantUM
- 下一篇: OpenCV学习笔记(六)(七)(八)(