opencv3编程入门——学习笔记(4)基础图像容器Mat类

上一篇文字里面其实还有个小坑。如果真的像我说的代码是自己敲的话就能发现。在代码的第35行有  srcImage.copyTo(tempImage); //复制源图到临时变量   的代码。其中.copyto()解释说是复制源图到一个临时变量。这里不知道大家有没有疑问。按照C语言的思想直接让scrImage = tempImage;不就好了嘛。非也,非也。正式因为这是C语言的思想。而咱们的代码是C++写的,可还是有区别滴。具体什么区别我们需要从Mat类开始讲起。话说。。。。
我们不去考虑opencv1.x的旧版本的历史问题。我们就说Mat类。大家知道自opencv2.0以来,我们opencv的接口就成了C++。在C++中提供了一个类的概念。方便了编程人员在使用一个矩阵(其实就是用来存储图片的一个变量)时,用完后不用去手工释放空间。同时大也明白图像运算的一些算法什么的计算量那是相当大的。这也就意味着十分消耗资源。为了解决这个问题。OPENCV2中就定义Mat类。来先看看Mat累的构成:一、矩阵头(里面包含了矩阵的大小、存储方式、存储地址等信息);二、一个指针。这个指针指向真正存着各个像素的数值的矩阵。有什么好处呢?看代码说话。
Mat A, C;//仅仅创建信息头部分
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR);//这里为矩阵开辟内存.
Mat B(A);//使用复制构造函数
C = A;//复制运算符

这些代码里A,B,C都是一个Mat类对象。这些对象的信息头不一样,但是他们最终指向的其实都是内存中同一个矩阵。不同的对象实际上只是通过不同方式访问了相同的数据而已。这也意味着如果我们改变其中某一个Mat类对象的像素值,那么其余的也会改变。

所以呀,如果需要真真正正地、完完全全地复制一个Mat类。不要使用赋值语句,也不要使用复制构造语句。而应该使用的是:

Mat F = A.clone();

Mat G;

A.copyTo(G);

现在改变F,或者G就不会影响A了。  

猜你喜欢

转载自blog.csdn.net/qq_27010559/article/details/80495695