基础图像容器Mat
我们可以通过各种各样的方法从现实世界获取数字图像,比如相机。通常由显示屏上看到的都是真实而漂亮的图像,但是这些图像再转化到我们的数字设备中是,记录的确实图像中的每个点的数值。其实,计算机中显示的图像是一个包含众多强度值的像素点的矩阵。
Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建副本是,大的开销是由矩阵造成的,而不是信息头。opencv是一个图像处理库,因此在函数中传递图像时常有的事。但是不到万不得已,不应该进行大图像的复制,因为一幅图像的全部信息是非常庞大的,会降低程序的运行速度。
为了解决这个问题,opencv使用了引用计数机制,思路是让每个Mat对象有自己的信息头,但共享同一个矩阵,者通过让矩阵指针指向同一个地址而实现,而拷贝构造函数则只是复制信息头和矩阵指针,而不是复制矩阵。
using namespace cv;
int main()
{
Mat A, C;
A = imread("LYU.jpg", 0);
Mat B(A);
C = A;
namedWindow("LYU", 0);
cvResizeWindow("LYU", 640, 480);
imshow("LYU",B);
waitKey(0);
}
可以理解成房屋买卖,房子的交易看作是对图像的运算,房子两个人交易,只需要交易房产证就可以了,房产证就证明这栋房子是你的了,不要把费心劳力的把一整栋房子搬过来砸你手上。
以上代码中所有Mat对象最终都指向同一个也是唯一一个数据矩阵。虽然他们的信息头不同,但是通过任何一个对象所作的改变也会影响其他对象。实际上,不同的对象只是访问相同数据的不同途径而已。