opencv中Mat的使用和设置ROI的方法

在较老版本的OPENCV中可以使用cvSetImageROI方法来设置ROI,但是必须使用IplImage指针,现在大部分方法都用Mat来存储图片,不再使用IplImage指针

在OPENCV2之后的版本里常使用的图像基础容器为Mat,其本体为一个矩阵,而数字图像就是一个二维矩阵。

关于Mat类,有两个有点:

第一:不必再手动为其开辟空间。

第二:不必在不需要时立即将空间释放。

Mat类由两个部分组成,矩阵头(包含矩阵信息和指向实际矩阵的一个指针)和实际矩阵组成。当声明矩阵而未对其赋值的时候不会有实际的矩阵空间开辟出来。在多个矩阵之间传递参数时也只需要传递矩阵头的信息,而不必要创建多个相同的矩阵。具体看书上的例子。

Mat A,C;//只创建矩阵头

A=imread("1.jpg");//实际开辟内存

Mat B(A);//拷贝构造函数只传递矩阵头

C=A;//赋值运算符只传递矩阵头

例子中使用的两种传递矩阵的方法都是只将矩阵头赋值了一份。实际上A,B,C三个矩阵头指针指向的是同一个矩阵。也就是说改变他们之中的任何一个另两个都会随之改变。

这样一来,在Mat方法里就有可以直接设置ROI的方法。看书上的例子:当然

Mat D(A,Rect(0,0,100,100));//使用矩形界定

Mat E=A(Range::all(),Range(1,3));//使用行列来界定

当然有时候我们不仅仅想要复制矩阵头,也想要复制矩阵本身可以使用clone和copyTo实现,书上例子如下:

Mat F=A.clone();

Mat G;

A.copyTo(G);

这样就可以得到三个一毛一样,但是又互不相关的矩阵。




你可能感兴趣的:(opencv,图片,ROI,Mat,OPENCV学习笔记)