一、Mat基础
1、在计算机内存中,数字图像是采用矩阵的方式保存的。Opencv2中,保存图像像素信息的是数据结构Mat阵,它包含两部分:矩阵头和一个指向像素数据的矩阵针。 矩阵头主要包含: 矩阵尺寸、存储方式、存储地址、引用计数 等。矩阵头的大小是一定的,不会随着图像的大小改变而改变,通常图像像素数据都会很大。因此,在图像的复制和传递过程中不需要复制整个Mat数据,只复制矩阵头和指向像素矩阵的指针即可。
2、由此会出现多个Mat共用一个矩阵数据的情况,那么内存回收的时候会存在什么时候释放矩阵数据的问题,对于释放内存的时候引用计数就会起作用了,当Mat对象被复制一次时,引用计数会加一,而销毁一个Mat对象(共用同一个图像矩阵数据)时引用计数减一,当引用计数为0的时候,矩阵数据就会被除。
3、在使用Mat的时候:
a、OpenCV中内存通常是自动分配,特殊情况需要特别指定。
b、使用OpenCV的C++接口时不用考虑内存释放问题。
c、需要复制矩阵数据,可以使用 Image.clone() 和 Image1.copyTo(Image2) 。
二、Mat存储方法
Mat矩阵中不同的每个元素可以使用不同数据类型,最小的数据类型是char型,占用一个字节(1byte=8bits),可以是有符号(0到255)和无符号(-127到127)的。在RGB颜色空间中,使用三个char型可以表示1600万种颜色.在Opencv中可以使用 cv::Scalar(b,g,r) 或者
1、在计算机内存中,数字图像是采用矩阵的方式保存的。Opencv2中,保存图像像素信息的是数据结构Mat阵,它包含两部分:矩阵头和一个指向像素数据的矩阵针。 矩阵头主要包含: 矩阵尺寸、存储方式、存储地址、引用计数 等。矩阵头的大小是一定的,不会随着图像的大小改变而改变,通常图像像素数据都会很大。因此,在图像的复制和传递过程中不需要复制整个Mat数据,只复制矩阵头和指向像素矩阵的指针即可。
2、由此会出现多个Mat共用一个矩阵数据的情况,那么内存回收的时候会存在什么时候释放矩阵数据的问题,对于释放内存的时候引用计数就会起作用了,当Mat对象被复制一次时,引用计数会加一,而销毁一个Mat对象(共用同一个图像矩阵数据)时引用计数减一,当引用计数为0的时候,矩阵数据就会被除。
3、在使用Mat的时候:
a、OpenCV中内存通常是自动分配,特殊情况需要特别指定。
b、使用OpenCV的C++接口时不用考虑内存释放问题。
c、需要复制矩阵数据,可以使用 Image.clone() 和 Image1.copyTo(Image2) 。
二、Mat存储方法
Mat矩阵中不同的每个元素可以使用不同数据类型,最小的数据类型是char型,占用一个字节(1byte=8bits),可以是有符号(0到255)和无符号(-127到127)的。在RGB颜色空间中,使用三个char型可以表示1600万种颜色.在Opencv中可以使用 cv::Scalar(b,g,r) 或者