OpenCV的命名规则

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代表Unsigned Integer,无正负号整数类型,S代表Signed 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(Unsigned Integer),S(Signed Integer),F(Float).