Mat对象的初始化和一些相关操作函数

Mat对象在opencv的图像处理中起着至关重要的作用。对于Mat对象的初始化有很多种方法。

(1)Mat(Size size, int type);//size数据可以通过Mat的子函数size获取,type数据表示图像的类型,常用的有CV_8UC3、CV_8UC1,第一个是说每个像素单元是8位uchar类型,图像通道数是3(比如BGR图像),第二个不同在于图像通道数是1(比如灰度图)

(2)Mat(int row,int col,int type,const Scalar &s);//这种初始化规模用行数列数表示(row与col可以和Size交换。无论用那个效果一样),Scalar用来初始化Mat对象内容,详见代码

(3)Mat.create(int row,int col,int type);Mat对象=Scalar();//利用Mat的子函数create来建立一个Mat对象,但是只能确定规模和类型,需要用Scalar函数来初始化内容。

测试代码如下:

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	Mat src = imread("1.jpg",1);
	if (src.empty())//判断是否读取到数据
	{
		cout << "cannot load!" << endl;
		getchar();
		return 0;
	}
	namedWindow("原图");
	imshow("原图", src);
	Mat dst1(src.size(), src.type(), Scalar(0, 0, 255));
	namedWindow("初始化1");
	imshow("初始化1", dst1);
	int row = src.rows, col = src.cols;
	Mat dst2 = Mat(row, col, src.type(), Scalar(0, 0, 255));
	namedWindow("初始化2");
	imshow("初始化2", dst2);
	Mat dst3 = Mat(row, col, CV_8UC3, Scalar(0, 0, 255));//因为图像是三通道的,所以每个大单元包含3个数,这里初始化为(0,0,255)表示红色
	namedWindow("初始化3");
	imshow("初始化3", dst3);
	Mat dst4;
	dst4.create(row, col, CV_8UC3);
	dst4 = Scalar(0, 0, 255);//另一种初始化内容的方式,效果一样
	namedWindow("初始化4");
	imshow("初始化4", dst4);
	waitKey(0);
	return 0;
}
效果图:


初始化出来的图像大小与原图一致,颜色均为红色(BGR:0,0,255)。


=================================================分割线================================================================


下面介绍一下一些常用的Mat子函数或者是和Mat对象相关的函数。

(1)void copyTo(Mat mat);//把自身复制一份赋给对象mat。

(2)Mat clone();//与copyTo的作用类似,返回一个和本身完全相同的Mat对象。

(3)int channels();//返回图像的通道数。

(4)bool empty();//判断Mat对象是否为空,常用于判读读取是否成功。

(5)uchar* ptr<uchar>(row);//获取图像第row行的头指针。

代码如下:

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	Mat src = imread("1.jpg",1);
	if (src.empty())//判断是否读取到数据
	{
		cout << "cannot load!" << endl;
		getchar();
		return 0;
	}
	namedWindow("原图");
	imshow("原图", src);
	/*Mat dst1(src.size(), src.type(), Scalar(0, 0, 255));
	namedWindow("初始化1");
	imshow("初始化1", dst1);
	int row = src.rows, col = src.cols;
	Mat dst2 = Mat(row, col, src.type(), Scalar(0, 0, 255));
	namedWindow("初始化2");
	imshow("初始化2", dst2);
	Mat dst3 = Mat(row, col, CV_8UC3, Scalar(0, 0, 255));//因为图像是三通道的,所以每个大单元包含3个数,这里初始化为(0,0,255)表示红色
	namedWindow("初始化3");
	imshow("初始化3", dst3);
	Mat dst4;
	dst4.create(row, col, CV_8UC3);
	dst4 = Scalar(0, 0, 255);//另一种初始化内容的方式,效果一样
	namedWindow("初始化4");
	imshow("初始化4", dst4);*/
	Mat dst1;
	src.copyTo(dst1);
	namedWindow("copyTo");
	imshow("copyTo", dst1);
	Mat dst2;
	dst2= src.clone();
	namedWindow("clone");
	imshow("clone", dst2);
	int cn = src.channels();
	printf("原图的通道数:%d\n", cn);
	uchar* pix = src.ptr<uchar>(0);//获取第一行像素值
	for (int i = 0; i < src.cols; i++)
		printf("%d ", pix[i]);
	waitKey(0);
	return 0;
}
效果图:





猜你喜欢

转载自blog.csdn.net/ZouCharming/article/details/69665079