图像在计算机中就是一堆点的数值,按顺序存储构成矩阵,opencv提供了一个 Mat 类来管理图像矩阵。html
Mat类由两部分组成:java
为何不直接在Mat中直接存储图像矩阵?算法
由于opencv处理对象时图片和视频,数据量都比较大,因此opencv采起的方法时,只在内存中保持一份图像矩阵,Mat类中只保持一个指向该内存的指针,达到图像矩阵共享的目的,节省存储资源的消耗。性能
另外,在作处理时不少方法牵涉到Mat对象复制操做,,对图像矩阵的操做都是比较重量级的,若是Mat对象中持有图像矩阵,那复制操做处理的数据就会很大,耗时很长,影响算法性能。采用持有矩阵头+图像矩阵指针的方式,在复制时,只须要复制矩阵头和指针便可,效率很高。编码
须要注意的时,多个Mat对象指向同一个图像矩阵时,某个Mat对象对图像矩阵的操做也会影响其余Mat对象。spa
图像矩阵何时被释放?指针
opencv采用引用计数的方式管理图像矩阵的释放,即每当新的Mat对象指向图像矩阵时,矩阵的计数器就会增长,Mat对象再也不指向该矩阵时,矩阵的计数器就减小,当计数器达到零时,矩阵就会被释放。code
如何存储图像像素值视频
如何存储图像像素值涉及两个方面:颜色空间、使用的数据类型。htm
Mat对象建立
opencv提供了不少Mat对象的建立方法,能够控制图像矩阵的维度、存储元素的数据类型和通道数、初始值。
//4行 3列 8位无符号Char型 3通道 元素通道默认值为(0,0,255)
Mat mat = new Mat(4, 3, CvType.CV_8UC3, new Scalar(0, 0, 255));
复制代码
注意:opencv的java sdk里面好像不支持建立多维(大于2维)Mat,因此有相关需求的仍是采用jni的方式直接调用opencv的C/C++方法。
其余还有不少灵活方便的Mat建立方法,这里再也不赘述,请参考官方文档