1. 得到Mat类型img的size,可以使用函数img.size(),注意这里有括号。但是在需得到img的行和列时,不需要使用括号,即使用img.rows和img.cols.
2. 已经定义好了img为Mat型,但是没有初始化,在后面程序的任何一个位置可以使用下面的代码初始化img,比如img=Mat(***1,***2),其中***1是矩形区域的大小,***2是数组内数据类型。
3. 在opencv中像素点的数据类型能找到对应类似char,int,float,double的,比如说是分别为CV_8UC1,CV_16UC1,CV_32FC1, CV_64FC1,一定要注意是没有这一说法的CV_16FC1。
4. 在对opencv工程进行debug时,如果想查看Mat型内部的数据,直接在变量监视器里面看是不行的,且观察时其内部还有可能报错。最好是将Mat类型数据cout到屏幕终端观察。
5. 将一个vector类型的变量转换成一个Mat型变量,可以采用下面的方法: Vector<Point>& c=contours(0);Mat cnew;Cnew=Mat(c);
6.Scalar与CvScalar类似,都是标量,用于存储像素值的,有4个通道,每个通道可存double型,其内部定义为:
typedef struct CvScalar
{double val[4];
}CvScalar;
7.当图像像素值为hsv空间时,hsv中3个分量的取值范围为[0 180],[0 255],[0,255].
8.opencv中的NAN表示是非数字,即Not A Number,INF表示无穷大,比如+INF:正无穷,-INF:负无穷。
9.RGB空间是类似人眼工作机制,被各种显示设备采用。HSV,HLS是描述颜色更自然的方法,去掉最后一个元素可以使算法对光照不敏感。YCrCb在jpeg中广泛使用。Lab是在感知上比较均匀的颜色空间,适合度量2个颜色之间的距离。
10.在使用zeros函数时,如果是用这个zeros(int rows, int cols, int type),注意第一个参数为rows,即图像的高度。如果是用zeros(Size size, int type)而size又为Size(cols, rows),其第一个参数为cols,即图像的宽度。即Mat大小先是高度然后是宽度,而size大小显示宽度然后是高度。
11. Size wholeSize;
Point roiofs;
img.locateROI(wholeSize, roiofs);
locateROI在此处是如果img图像是从其它父图像中某一部分得来的,那么其父图像221 的大小尺寸就为whleSize了,img图像左上角那个点相对于父图像的左上角位置就为点roiofs了。
12. 在opencv学习中,经常会读一些基于1.0版本的opencv代码,如果我们需要在2.0以后版本中使用已有的代码,遇到的问题最多的就是Mat和IplImage*之间的转换,现在举个例子来简单说明一下这2者之间的转换。
假设已经定义: Mat src;
IplImage* img;
并且也假设src或者img中已经有了数据。则如果需要将src转换到img,应该使用下面的语句:
img = &src.operator IplImage();
如果是将img转换到src,则直接使用下面的语句:
src = Mat(img);
这是opencv基于c版本和c++版本混合编程的处理方法。
13. 在opencv的core.hpp里面有AutoBuffer<>()函数,该函数为自动分配一段指定大小的内存,并且可以指定内存中数据的类型。
14.调用Mat::copyTo()函数时,如果需要有mask操作,则不管源图像是多少通道的,其mask矩阵都要定义为单通道,另外可以对一个mask矩阵画一个填充的矩形来达到使mask矩阵中对应ROI的位置的值为设定值,这样就不需要去一一扫描赋值了。
15. 在使用OpenCV的Mat矩阵且需要对该矩阵进行扫描时,一定要注意其取值顺序,比如说列和行的顺序,如果弄反了,则经常会报内存错误。
16. 在使用OpenCV内部的判断条件时应该使用CV_Assert()函数,而不是CV_ASSERT()。
17. 通过实验测试发现,虽然经过calcHist()函数计算过后的直方图保存在hist中,这里hist是一个Mat类型,并且如果计算的是一维的直方图的话,则hist是一个列向量。
18. 当Mat中数据的类型为CV_16UC1的时候,这里的16U并不是指unsigned int,而是指的是unsigned short int,因为在OpenCV框架中,int不是16位的,而是32位的。没想到我使用OpenCV一年了,今天才弄清楚这个。
19. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。(虽然网上有学着说OpenCV中有些数据结构的坐标原点是在图片的左下角,但是我暂时还没碰到过)。
20. 在使用image.at<TP>(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at<TP>(Point(x2, x1))效果相同。
21. 如果所画图像是多通道的,比如说image图像的通道数时n,则使用Mat::at(x, y)时,其x的范围依旧是0到image的height,而y的取值范围则是0到image的width乘以n,因为这个时候是有n个通道,所以每个像素需要占有n列。但是如果在同样的情况下,使用Mat::at(point)来访问的话,则这时候可以不用考虑通道的个数,因为你要赋值给获取Mat::at(point)的值时,都不是一个数字,而是一个对应的n维向量。
22. 多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像素点其实有多个坐标,所以是不会给出的。因此在编程时,这2个位置应该给NULL。