OpenCV 矩阵:图像的基本2015-05-15我们有很多方式可以从现实生活中得到图片,数码相机,扫描仪,或者我们几乎人手有一部的手机。然而,当生活中的图在数字设备上存储的时候,一幅图片被分成了很多很多的像素点,像素点就像拼图的时候的碎片,一个个碎片来构成一副图。而每个像素点都是由一个0-255的数字值来表示。在openCV中,一个图片被很多像素点表示,这些表示像素点的值构成了一个矩阵。

上面的图中,由表示像素点的值构成了矩阵,在openCV中,Mat(矩阵)是表示图片的基本。Mat由两部分组成,一个是matrixheader,里面存储了一些信息,比如矩阵的大小,矩阵的存储地址等;另外一个是矩阵,里面包含了图片的每一个像素值。明白了Mat有两部分组成后,能够更好的理解Mat的赋值。看下面的一段代码
#include<iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp> using namespace cv; int main(){Mat A, C;// 声明其实只是创建了header部分A = imread("zh.png",CV_LOAD_IMAGE_COLOR); // 这里,A的matrix部分指向了一个矩阵 Mat B(A);// 使用构造方法赋值,其实只有header部分复制了,//但是matrix复制的是地址空间,指向的是同一片区域 C = A;// 同理,header部分复制了,但是matrix指向同一片区域//A = A * 0;//只是改变了A,但是三幅图都变了imshow("A", A); //显示的三幅图片都是同一片区域imshow("B", B);imshow("C", C);waitKey();return 0;}
上面的A,B,C的header只是值相同,但是每一个Mat都有自己的header,但是matrix不一样,他们不仅仅值相同,并且指向相同的地址空间。现在你可能会疑惑,如果三个Mat的matrix都是同一片地址空间,那么当它不再需要的时候,由谁来清除它。其实由最后一个使用它的那个Mat来清除,这里面涉及的引用计数问题,和C++的引用计数应该是相似的。如果我们需要一个和原来矩阵值一样,但是原来Mat的改变不会影响新的Mat。解决这个,openCV提供了clone() 和copyTo() 这两个函数。
Mat F = A.clone();Mat G;A. copyTo(G);
上面的G和F,现在的值和A一样,但是A的改变不会影响到他们。
存储的方式:
就是如何存储像素值,最简单的方式是用灰度矩阵来存储,前提是我们的图片是黑白的时候,当然还有一些其它的图片存储方式,比如常见的RGB。