- Mat对象
- Mat对象和IPllmage对象
- Mat对象的使用
- Mat常用构造函数
- Mat对象创建
- 总结
Mat对象是opencv2.0之后引入的图像数据结构,能自动分配内存,不存在内存泄露的问题,是面向对象的数据结构,分了两个部分,头部和数据部分。
Ipllmage是从2001年opencv发布后就一直存在,是C语言的风格的数据结构,需要开发者自行分配与管理内存,对大型程序使用它容易导致内存泄露问题。
Mat对象与Ipllmage对象相比,Mat对象使用起来更方便,不需要自己去分配内存和管理。所以不存在内存泄露的问题。
因为笔者是opencv4,所以我们下面的内容都使用Mat对象。
使用VisualStudio创建项目、配置opencv等我便不在叙述了,这里直接给出代码
#include#include //命名空间 using namespace std; using namespace cv; int main(int argc,char **argv) { //Mat对象 Mat src; //默认导入原图 src = imread("test.png"); if (src.empty() ){ cout << "图像未导入" << endl; return -1; } //src窗体标题 char srcTitle[]="srcImage"; namedWindow(srcTitle,WINDOW_AUTOSIZE); imshow(srcTitle,src); waitKey(0); return 0; }
Mat常用基础方法
void copyTo(Mat mat):克隆,就是把Mat复制一份,不切换数据 void converTo(Mat dst,int type):完全复制一份,可以切换数据类型 Mat clone():克隆,完全复制/拷贝 int channels():获取图片通道数 int depth():深度 uchar *ptr(i=0):行指针 int cols=src.cols:/获取图片src的例 int rows=src.rows://获取图片src的行
代码演示放在最后
Mat常用构造函数Scalar(127,0,255);:创建空白函数
dst = Mat(src.size(), src.type());//常见构造类型,src为上一个图片的图片矩阵
dst.channels();//查看有多少个api?(查看是几通道)
//构造函数,基本常见语法
Mat()
Mat(int cols,int rows,int type)
Mat(Size size,int type)
Mat(int rows,int cols,int tpe,const Scala &s)
Mat(int ndims,const int *sizes,int type)
Mat(int ndims,const int *size,int type)
Mat(int ndims,const int *sizes, int type,const Scalar &s)
Mat对象创建
Mat:Mat构造函数
Mat M(2,2,CV_8UC3,Scalar(0,0,255)):其中前两个函数分别表示列(rows),行(cols),第三个参数CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型,3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致。
Mat ::create
int array[3]={2,2,2};
Mat lL(3,array,CV_8UC1,Scalar::all(0));
Mat定义数组
create版本
//创建数组 //给出矩阵 //以src矩阵模板,创建一个新的矩阵dst dst.create(src.size(),src.type()); //给dst dst=Scalar(0,255,0);
提高图片对比度
Mat img; Mat kernel = (Mat_(3,3)<<-1,0,-1,-1,5,-1,0,-1,0); //提高图片对比度 filter2D(src,img,-1,kernel);
以src为模板创建一个黑色的图像
Mat newSrc=Mat::zeros(src.size(),src.type());
代码演示:
#include#include using namespace std; using namespace cv; int main3(int argc, char** argv) { Mat src; src = imread("test1.png"); if (src.empty()) { cout << "图像未导入" << endl; return -1; } char srcTitle[]="srcImage"; imshow(srcTitle, src); //创建空白图像:Scalar为给空白图像绘制颜色 Mat dst; char dstTitle[]="dstImage"; //创建一个和src一样大小的图像 dst = Mat(src.size(), src.type()); dst = Scalar(127, 0, 255); imshow(dstTitle, dst); //克隆:clone char cloneTitle[]="cloneImage"; Mat dst = src.clone(); imshow("clone", dst); Mat dst; cvtColor(src, dst, COLOR_BGR2GRAY); int cols = dst.cols; int rows = dst.rows; cout << "例:" << cols << endl; cout << "行:" << rows << endl; cout << "src通道:" << src.channels() << endl; cout << "dst通道:" << dst.channels() << endl; const uchar* dstRow = dst.ptr (0); cout << "指针" << *dstRow << endl; Mat M(100, 100, CV_8SC3, Scalar(0, 0, 255)); //cout << "M=" << endl << M << endl; //创建数组 Mat array; arry.create(src.size(), src.type()); arry = Scalar(0, 255, 0); //定义一个小数组,使用Filter2D提高图像对比度 Mat crec; Mat kernel = (Mat_ (3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(src, crec, -1, kernel); //创建纯黑的图像 Mat zero = Mat::zeros(src.size(), src.type()); imshow("dst", zero); waitKey(0); return 0; }
通过上面的代码,我们可以看出,提高图片对比度的一个函数:filter2D()。
总结Mat对象到此就结束了,回忆上面写的,感觉也没写啥,其实我觉得最实用的就是提高图片的对比度(filter2D),也就是提高图片的效果。不过总的来说,笔者觉得,无论是什么技术,我们都需要掌握基础,才能进阶。
同时提醒各位看到这篇博客的孩纸,也提醒我自己,重要的事情说三遍。
基础很重要!
基础很重要!
基础很重要!
文中如有错误,请联系笔者修改!
如有侵权,请联系笔者删除!



