1.
cvCreateMat包括cvCreateMatHeader(创建CvMat结构,不为数据分配内存)和cvCreateData(只负责数据的内存分配)
cvCloneMat不仅创建一个和输入头一样的头,也分配各自数据区并将元数据复制到新的对象中。
CvMat*cvCreateMat(int rows,int cols,int type);
CvMat *cvCreateMatHeader(introws,int cols,int type);
CvMat*cvinitMatHeader(CvMat *mat,int rows,int cols,int type,void *data=NULL,intstep=CV_AUTOSTEP);
2.cvLoadImage
img=cvLoadImage(fileName,flag);
flag: >0 将读入的图像强制转换为一幅三通道彩色图像
=0 将读入的图像强制转换为一幅单通道灰度图像
<0 读入的图像通道数与所读入的文件相同.
3.马氏距离
http://people.revoledu.com/kardi/tutorial/Similarity/MahalanobisDistance.html
4.以下都是共享数据区域,一个修改
Mat A,C;
A=imread("a.jpg");
C=A;
Mat B(A);
以下是真正的拷贝
Mat F=A.clone();
Mat G;
A.copyTo(G);
5.IplImage----->Mat
IplImage *img=cvLoadImage();
Mat mtx(img);
Mat-àIplImage,CvMat
Mat I;
IplImage pI=I;
CvMat mI=I;
Mat---àIplImage,CvMat
Mat I;
IplImage* pI=&I.operator IplImage();
CvMat* mI=&I.operator CvMat();
6.Mat M;
M.create(4,4,CV_8UC(2));//4*4的二通道矩阵
7.构造小矩阵
MacC=(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,5,-1,0,-1,0);//构造模板
Mat R=C.row(1).clone();//复制一行
Mat M(3,2,CV_8UC3);//3个通道
randu(M,Scalar::all(0),Scalar::all(255));//均匀分布随机数组,3行,6列
8.一种操作矩阵数据方式
MatIterator_<Vec3b> it,end;
For(it=I.begin<Vec3b>(),end=I.end<Vec3b>();it!=end;++it)
{//只有一个循环
(*it)[0]=table[(*it)[0]];
(*it)[1]=table[(*it)[1]];
(*it)[2]=table[(*it)[2]];
}
9.ellipse的旋转角度和起末旋转角度都是和坐标轴的那种旋转方向不同的,也就是这里的旋转方向都是按照顺时针的。还有要注意的是和circle一样,参数thickness=-1时,图形就是填充的。
10.关于Scalar(255,0,0)作为RGB时,尽然是蓝色的,看来这个又是反的。
11.要想用RNG产生随机数,要这样用RNG rng = RNG(getTickCount());这样每次运行结果都不同。特别是getTickCount()是64bit系统专用的。
12.关于直接使用FileStorage实现类的读写,在samples下的filestorage.cpp文件有描述
13.saturate_cast<uchar>等用来确保数字不越界。比如saturate_cast<uchar>(280)--à255;
14.bilateralFilter双边滤波器,由于之前的平滑都把边缘平滑了,所以使用了双边滤波器。
d>5时会很慢,一般用d=5,当Sigmavalues大于10,会有卡通效果。
No in place
http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
15.腐蚀、膨胀
erode,dilation
减小噪声,孤立单独像素或者分离像素,在图像中寻找洞(黑色)或者密集(白色)的洞
16.anchorpoint=Point(-1,-1)的问题
看到如下的话:
Mat element =getStructuringElement( dilation_type,Size( 2*dilation_size +1, 2*dilation_size+1 ),Point( dilation_size, dilation_size ));
/// Apply the dilation operation
那么如果Point(-1,-1)在这里则就是表示Point(dilation..)的意思了,而Point(0,0)表示最左上角的第一个元素。
17.通过convertScaleAbs来实现任意图像类型转化成可以显示的8U类型图像
18.通过把Soble的横纵图像按照0.5的权重相加的效果比直接使用Sobel(I,out3,CV_16S,1,1,3);好多了。而之所以使用CV_16S是防止溢出。
19.remap
Remap的作用看起来就是为了从新把图像像素进行移动,他把下标x和y拆开了计算,很有趣。暂不知道有多大用处。