OpenCV使用近似匈牙利命名法的方法,比較值得一提的特色是,它的資料結構幾乎都是大寫的Cv開頭,而他的副程式都是小寫的cv,舉個例子:
CvSize ImageSize1 = cvSize(400,300); //cvSize(width,height)
資料結構ImageSize1的型態是CvSize,藉由cvSize()這個副程式來初始化資料結構,400代表的是寬,300代表的是高,CvSize資料結構底下包含著width及height兩個整數型別,可以用ImageSize1->width,ImageSize1->height來檢視.唯一差別是,cvSize()順便用malloc()配置了資料結構的記憶體位址.
再來提到函數(副程式)命名規則,cvActionTargetMethod(),這只是提升了程式的易讀性,用什麼動作,哪個目標,用什麼方法,常遇到的狀況有四種:
1.cvActionTarget()
2.cvTarget()
3.cvMethod()
4.cvActionMethod()
1.的話就如cvCreateImage(),cvNamedWindow()等,
2.的話幾乎很常見如cvMat(),cvSize(),cvPoint(),
3.的話比較常用的是演算法,或是某方法,cvDCT()離散餘弦轉換演算法,
4.的話就如cvFindContours()找出輪廓演算法或是一般也可以用滑鼠事件,鍵盤事件來表達如:DoubleClickedMouse()(這個例子不在OpenCV命名之內),這種做法對於常寫程式的人而言是相當重要的技巧,初始化資料結構就直接用名詞(如同物件導向一般),副程式的行為就用動詞+名詞,當再建構一個程式或系統的時候可以很輕易的就用資料流程圖(DFD)表達出來,這應該是要養成的良好習慣,而不是要用aa(),bb()這種奇怪的副程式名稱了。
參數命名規則,這裡指的參數是大寫英文加底線的那個,如:
CV_8UC1
IPL_DEPTH_8U
CV_BLUR_NO_SCALE
這種代表的參數非常之多,背後代表的意義只是數字的代號,被#define所定義,就像
#define CV_BLUR_NO_SCALE 0
CV_BLUR_NO_SCALE就會被0所替換,有些參數後面的數字意義很可能會被用公式重新計算,所以不需要去了解他們背後的數字代碼代表什麼.
一般的參數都很容易從字面上的意義去了解, 比較特殊的是,
矩陣跟圖形的創立參數,cvCreateMat(), cvCreateImage(), 矩陣參數的命名規則,
是用大寫CV_(位元數)+(資料型態)+(Channel數),全部的矩陣參數如下所示:
CV_8UC1 CV_8SC1 CV_16UC1 CV_16SC1 CV_32SC1 CV_32FC1 CV_64FC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2 CV_32SC2 CV_32FC2 CV_64FC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3 CV_32SC3 CV_32FC3 CV_64FC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4 CV_32SC4 CV_32FC4 CV_64FC4
裡面的位元數,分別代表8bits,16bits,32bits,64bits,
資料型態,
U代表Unsign Integer,無正負號整數型態, S代表Sign Integer,正負號整數型態, F代表Float,浮點數型態,
Channel數的部份,
C1代表單通道,C2代表兩個通道,C3代表三個通道,以此類推,這裡的通道表示的是色彩空間的維度,
像BMP格式的RGB格式它的Channel就是3,說簡單一點的話C1代表一個二維陣列,C2代表兩個二維陣列,C3代表三個二維陣列,以此類推.
再來就是介紹cvCreateImage()圖形參數它們會固定用IPL_DEPTH_開頭,
它的命名規則為IPL_DEPTH_(位元數)+(資料型態),全部的圖形創立參數如下所示:
IPL_DEPTH_1U IPL_DEPTH_32F IPL_DEPTH_8S
IPL_DEPTH_8U IPL_DEPTH_16S
IPL_DEPTH_16U IPL_DEPTH_32S
所有的說明皆同上的矩陣規則,
位元數分別有1bit(黑白二元圖),8bits,16bits,32bits,
資料型態分別為U(Unsign Integer),S(Sign Integer),F(Float).
ref:
http://yester-place.blogspot.tw/2008/06/blog-post.html
留言列表