很久之前的学习OpenCV学习笔记

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拆开了计算,很有趣。暂不知道有多大用处。

你可能感兴趣的:(opencv,opencv,opencv,opencv,opencv,opencv,opencv)