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