Mat是一个类(class)
- Mat image默认大小为0,但是也可以设置初始值,通过Mat image(240,320,CV_8U,Scalar(100));
- 使用Mat创建的图像,当对象超出范围时,内存会自动释放。
Mat创建的图像是浅复制,并不将原来图像的每个像素拷贝过来
- Mat image1,image2;
- image1=result;//这两个图像指向同一块内存
- result.copyTo(image2);//这才是将像素都拷贝过去了。
if (!image.data){}//确认读入图像成功
- data作为Mat类的一个成员变量,是一个指向图片申请的内存的指针,为0时表示没有图片读入。
CvMat是一个结构(struct)
- CvMat* cvCreatMat(int rows ,int cols , int type);//矩阵变换函数; type定义了矩阵的元素,可以是32位浮点数型数据CV_32FC1,或者是无符号的8位三元组的整型数据CV_8UC3;type结构为CV_(S|U|F)C
IplImage也是一个结构(struct)
- IplImage内部buffer每行按4字节对齐
- 通过cvCreateImage创建后复制像素到创建的内存。之后还需要释放内存。
Mat | IplImage | |
---|---|---|
创建图像 | Mat image; | IplImage* image=cvCreateImage(CvSize(400,300), int depth, int channels); |
读取图像 | image=imread(“luhan.jpg”); | IplImage* cvLoadImage(“image.jpg”,int iscolor);//iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。 |
定义图像窗口 | namedWindow(“new window”,int flags=WINDOW_AUTOSIZE);/flags可以为WINDOW_NORMAL,用户可以改变窗口的大小;WINDOW_AUTOSIZE窗口大小会自动调整,无法手动改变。/ | cvNamedWindow(“new window”,unsigned long flags);/flags可以选择CV_WINDOW_AUTOSIZE,表示窗口尺寸与图像原始尺寸相同,也可以选择0,表示以固定的窗口尺寸显示图像/ |
显示图像 | imshow(“new window”,image); | cvShowImage(“new window”,image); |
写入图像 | imwrite(“result.bmp”,result); | cvSaveImage(“result.bmp”,result) |
图像销毁 | 自动释放 | cvReleaseImage(image); |
- IplImage转换到Mat
- IplImage* iplImage=cvLoadImage(“luhan.jpg”);
- Mat image(iplImage,false);
/*其中false是默认值,可以省略,表示数据不会被拷贝,上例中iplImage和image指向同一块数据,true的话表示会拷贝数据。拷贝了的话记得要释放内存哦,cvReleaseImage(&iplImage);
最好还是用Mat创建啦!*/