赞
踩
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;
- }

效果图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。