#include <opencv2\opencv.hpp>
#include <iostream>
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<uchar>(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;
}
(03)Mat对象
最新推荐文章于 2022-03-16 17:11:40 发布