Android开发Android技术知识Android开发经验谈

opencv-android-图像容器 Mat

2019-02-21  本文已影响8人  昵称真难选

图像在计算机中就是一堆点的数值,按顺序存储构成矩阵,opencv提供了一个 Mat 类来管理图像矩阵。

Mat类由两部分组成:

为什么不直接在Mat中直接存储图像矩阵?

因为opencv处理对象时图片和视频,数据量都比较大,所以opencv采取的方法时,只在内存中保持一份图像矩阵,Mat类中只保持一个指向该内存的指针,达到图像矩阵共享的目的,节省存储资源的消耗。

另外,在做处理时很多方法牵涉到Mat对象复制操作,,对图像矩阵的操作都是比较重量级的,如果Mat对象中持有图像矩阵,那复制操作处理的数据就会很大,耗时很长,影响算法性能。采用持有矩阵头+图像矩阵指针的方式,在复制时,只需要复制矩阵头和指针即可,效率很高。

需要注意的时,多个Mat对象指向同一个图像矩阵时,某个Mat对象对图像矩阵的操作也会影响其他Mat对象。

图像矩阵什么时候被释放?

opencv采用引用计数的方式管理图像矩阵的释放,即每当新的Mat对象指向图像矩阵时,矩阵的计数器就会增加,Mat对象不再指向该矩阵时,矩阵的计数器就减少,当计数器达到零时,矩阵就会被释放。

如何存储图像像素值

如何存储图像像素值涉及两个方面:颜色空间、使用的数据类型。

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创建方法,这里不再赘述,请参考官方文档

上一篇下一篇

猜你喜欢

热点阅读