(03)Mat对象

#include 
#include 

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat src;
	src = imread("D:/A_Graduation/learning/opencv/tangwei.jpg");
	if (!src.data)
	{
		printf("Could not load image...\n");
		return -1;
	}

	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src); 

	namedWindow("output1", CV_WINDOW_AUTOSIZE);
	namedWindow("output2", CV_WINDOW_AUTOSIZE);
	namedWindow("output3", CV_WINDOW_AUTOSIZE);
	namedWindow("output4", CV_WINDOW_AUTOSIZE);
	namedWindow("output5", CV_WINDOW_AUTOSIZE);
	namedWindow("output6", CV_WINDOW_AUTOSIZE);
	namedWindow("output7", CV_WINDOW_AUTOSIZE);
	namedWindow("output8", CV_WINDOW_AUTOSIZE);
	
	/*
	Mat对象 
	图像数据结构,自动分配内存,不存在内存泄漏的问题
	是面向对象的数据结构,分了两个部分,头部和数据部分
	*/
//-------------------------------------------------------------------------------------------------------------------------
	/*
	M:这个小图像的用处:在做图像处理的时候,做了一个算法, 想creat一个很小的图像,里面的每个像素都是我们知道的
	然后去run这个算法,看它和预期的图像结果是不是一致,如果是的话验证我们算法的正确性,再去run那些大的图,要
	不然有问题的话很难调整

	Mat M(5, 5, CV_8UC3, Scalar(0, 0, 255));
	其中前两个参数分别表示行(row)跟列(column)
	第三个CV_8UC3中的8表示每个通道站8位、U表示无符号、C表示Char类型、UC表示无符号的char即uchar,3表示通道数目是3
	第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致,这里通道数目是3,所以这里向量长度是3
	这里的第四个参数->数据:因为图像是三通道的,所以每个大单元包含3个数,这里初始化为(0,0,255)表示红色
	CvMat矩阵对应的参数类型就是
	CV_8UC1,CV_8UC2,CV_8UC3。
	(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)
	*/
	Mat M(5, 5, CV_8UC3, Scalar(0, 0, 255));
	Mat C(50, 50, CV_8UC1, Scalar(127));
	cout << "C = " << C << endl;
	cout << "M = " << M << endl; //把M打印出来,5*5的一个像素的集合,这是一个很小的图像, 每个像素都有三个通道
	imshow("output1", M);
	imshow("output2", C);

	//创造一个空白图像
	Mat D;
	D = Mat(src.size(), src.type()); //初始化了一个Mat对象,大小和类型和原来的一摸一样
	D = Scalar(127, 0, 255);//给D赋值,三个数全为零就是黑色背景的空白图像,三个数全部为255就是白色的空白图像
	imshow("output3", D);

	//创建多维数组cv::Mat::create创建二维(三维的一般不用, 所以不记载)
	Mat L;
	L.create(src.size(), src.type()); //创建一个与src大小和类型一样的二维数组即一张图像,Mat内存的对象
	L = Scalar(0, 0, 0);
	imshow("output4", L);

	/*
	Mat对象的使用--部分复制:复制操作和拷贝构造函数只会复制头部分
	一般情况下只会复制Mat对象的头和指针部分, 不会复制数据部分
	*/
	Mat B(src); //比如这个用拷贝构造函数来创建一个对象的时候,
				//Mat只会复制src的头部,不会复制数据部分, 数据部分应该是指针指向同一个地址
	imshow("outoput5", B);
	/*
	Mat对象的使用--完全复制:使用clone和copyTo两个函数实现数据完全复制
	如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
	*/
	Mat F = src.clone();
	Mat G;
	src.copyTo(G);
	imshow("outoput6", F);
	imshow("outoput7", G);

	Mat dst;
	cvtColor(src, dst, CV_BGR2GRAY);
	printf("input image channels: %d\n", src.channels()); //cvtColor转换之后对比两张图的通道数
	printf("output image channels: %d\n", dst.channels()); //如果还想知道它的通道数就这样
	imshow("output8", dst);
//-------------------------------------------------------------------------------------------------------------------------
	const uchar *firstRow = dst.ptr(0); //因为dst是单通道的图像了,所以就可以获取它的第0行的灰度值是多少
											   //这是第一行, 第一行还有好多列呢
	//得到dst全部的行和列
	int cols = dst.cols;
	int rows = dst.rows;
	printf("rows: %d, cols:%d\n", rows, cols);

	printf("first pixel value: %d\n", *firstRow); //打印出第一个像素值,因为firstRow是指针
	for (int i = 0; i < src.cols; i++) //获取第一行像素值
		printf("%d ", firstRow[i]);
//----------------------------------------------------------------------------------------------------------------------
	/*
	定义小数组,与上一节定义3*3的掩膜是一样的
	*/

	waitKey(0);

	return 0;
}

你可能感兴趣的:(OpenCV,OpenCV)