您的位置:首页 > 其它

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

2017-04-08 11:12 519 查看
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;
}
效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: