opencv笔记1

本文深入探讨了OpenCV从C语言到C++过渡的重要变化之一——Mat类的引入。Mat类提供了一种更高效、灵活的方式来管理图像数据,相较于之前的IplImage,Mat类能够动态管理内存,显著减少了数据开销。通过引用机制,多个Mat实例可以共享相同的像素矩阵,直到最后一个实例被销毁。本文详细解释了Mat类的构造函数、内存管理机制以及与原始IplImage结构体相比的优势,为开发者提供了在图像处理项目中利用Mat类进行高效内存操作的指南。

在opencv2.0前,opencv使用C语言实现相关函数,那个时候存储图像的文件类型是IplImage,需要程序员手动管理内存。

在opencv2.0后,opencv引入了C++,Mat类就是其中一个变化。

  Mat类似于STL中的容器类,能够动态管理内存。Mat类两部分数据,第一个是数据头(matrix header),它的占用的空间大小恒定,它包含了像素矩阵的大小,存储文件的方式,像素矩阵存储的地址等等。第二个是指向像素矩阵的指针,指正指向的大小不恒定,根据图像的变化而变化。

由于图像处理,往往会涉及大规模的数据,如果像拷贝其他数据结构一样拷贝Mat,会产生非常高的数据开销。所以,Mat类的不同实例的拷贝,只拷贝数据头。

Mat A, B;
A= imread("1.jpg",CV_LOAD_IMAGE_COLOR);
B=A;
Mat C(A);

  上述代码,A B C都指向同一块像素矩阵。这里有一个叫做引用机制(reference counting machanism)的东西,就是说如果有多个同时复制的Mat对象,只当最后一个Mat对象被删除时,像素矩阵才会随着一起删除。

如果想要把像素矩阵也复制过去可以这样:

Mat A,B;
A=imread("1.jpg",CV_LOAD_IMAGE_COLOR);
A.copyto(B);
//B=A.clone();

  Mat的构造函数:

Mat M(2, 2, CV_8UC3, Scalar(255,0,255));//注意只有二维的Mat才能用<<输出
cout<<"M="<<endl<<" "<<M<<endl;

参数的输入是:

 

 

 

这里的注意2,2指的创建一个2*2的二维数组;

CV_8UC3是:CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]

代表3个通道,注意在数组中,这三个通道的数据是连着的,也就是

[第一个像素的三个通道的值 第二个像素的三个通道的值(第一行结束); 第三个像素的 第四个的]

Mat类还有很多IplImage结构体所没有的优点,待发掘。

转载于:https://www.cnblogs.com/wangpei0522/p/3748716.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值