Mat的一些小知识

Mat的一些简单注意点

参考来源:OpenCV Mat类详解和用法

1.历史

  1.早期的OpenCV是以Ipllmage的结构体作为图像的数据格式,需要手动进行内存管理,这时候是基于C的
  2.OpenCV2.0后引进了一种新的针对于C++的接口Mat对象,不需要用户手动进行内存管理

2.略解

Mat的数据部分:
  矩阵头(包含矩阵大小,用于储存的方法、储存矩阵的地址信息、引用计数等)
  指向储存数据的指针

Mat的复制与清理:
  Mat这个部分OpenCV采用了参考计数系统:其中每一个Mat对象队友自己的头,包含了图像的基本信息(大小、类型、通道),两个Mat对象都是通过矩阵指针指向同一个地址来共享矩阵,节省储存空间,相互之间复制一般也是复制矩阵头与矩阵指针,图像的数据本身还是共享的。

    Mat A,B;
    A=cv::imread(_path);
    B=A;
    Mat C=A;

  这里面的几个就是矩阵头不一样,数据都是一样的
  当多个对象都同时使用同一个矩阵的时候,是由最后一个使用它的对象进行清理
  如果需要保存原数据并且还要更改的时候,这时候就会用clone或者copyTo来进行深拷贝
通道储存方式:
  OpenCV的储存方式(BGR)不同于一般的图像储存方式(RGB),这个应该是历史遗留的问题

Mat元素的访问:
  1.直接指针访问---性能最好
  2.迭代器MatIterator---这种应该更安全一点针对于数据不是连续储存的
  3.带引用返回的动态地址计算方式 Mat.at()
  4.用自带函数LUT---这个我没有用过

posted @ 2024-06-19 22:06  路人蚁  阅读(75)  评论(0)    收藏  举报