C++图像处理初学——Mat对象

C++图像处理初学——Mat对象,第1张

Mat对象

文章目录
  • Mat对象
    • Mat对象和IPllmage对象
    • Mat对象的使用
    • Mat常用构造函数
    • Mat对象创建
    • 总结

Mat对象和IPllmage对象

Mat对象是opencv2.0之后引入的图像数据结构,能自动分配内存,不存在内存泄露的问题,是面向对象的数据结构,分了两个部分,头部和数据部分。
Ipllmage是从2001年opencv发布后就一直存在,是C语言的风格的数据结构,需要开发者自行分配与管理内存,对大型程序使用它容易导致内存泄露问题。
Mat对象与Ipllmage对象相比,Mat对象使用起来更方便,不需要自己去分配内存和管理。所以不存在内存泄露的问题。
因为笔者是opencv4,所以我们下面的内容都使用Mat对象。

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),也就是提高图片的效果。不过总的来说,笔者觉得,无论是什么技术,我们都需要掌握基础,才能进阶。
同时提醒各位看到这篇博客的孩纸,也提醒我自己,重要的事情说三遍。
基础很重要!
基础很重要!
基础很重要!
文中如有错误,请联系笔者修改!
如有侵权,请联系笔者删除!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1499247.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存