Mat对象的详细介绍以及第一段代码详解
代码
先上代码。
我自学的方式是先看代码,然后在代码中遇到不懂的再逐个查询资料,深入学习,直到学懂。大家按照符合自己的方式学习就好了,适合自己的才是最好的。共勉。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread("E:/minions.jpg");
Mat src1 = imread("E:/minions.jpg", IMREAD_GRAYSCALE);//以灰度图像的方式加载进来
if (src.empty())
{
cout << "error" << endl;
return -1;
}
namedWindow("原图", WINDOW_AUTOSIZE);
imshow("原图", src);//imshow(窗口名称,对象)
namedWindow("导入灰度图", WINDOW_AUTOSIZE);
imshow("导入灰度图", src1);//imshow(窗口名称,对象)
Mat dst;
cvtColor(src, dst, COLOR_BGR2GRAY);//把原图像转换为灰度图像
namedWindow("改为灰度图", WINDOW_AUTOSIZE);
imshow("改为灰度图", dst);
Mat dst1;
cvtColor(src, dst1, COLOR_BGR2HLS);//把原图像转换为饱和度亮度改变
namedWindow("改为高饱和度", WINDOW_AUTOSIZE);
imshow("改为高饱和度", dst1);
imwrite("E:/outputimage1.jpg",dst1);
waitKey(0);
return 0;
}
Mat对象参数介绍
上面代码中出现的Mat对象是一个面向对象的数据结构,分为头部和数据两部分。一般情况下,使用的是Mat对象的参数主要是以下几种形式:
- (int rows, int cols, int type)(行数,列数,类型);
- (int size, int type) (大小,类型);
- (int rows, int cols, int type, const Scalar &s)
- (int size, int type, const Scalar &s)
其实size和上面的rows、cols意思一样,不过在某些时候使用size会更简洁一些,根据情况来选择使用就可以,功能是上没有本质的区别(目前我没碰到过不同,有可能有区别,我太小白了没遇到).
s是初始化时的一个可选的标量,指初始化时每个元素的像素值是多少;
至于type,其形式一般是CV_x(U|S|F)Cy这种类型的,USF分别代表无符号整数,有符号整数,浮点数,使用的时候要根据情况三选一,x是比特数,y是通道数,例如x=8,y=1时—-CV_8UC1,指8比特单通道。
Mat对象的特点
- 输出图像的内存是自动分配的;
- 使用opencv的c++接口,不需要考虑内存分配的问题;
- 赋值和拷贝构造函数只会复制头部(也就是部分复制);
- 使用clone()函数和copyTo()函数可以实现完全复制;
代码中其他的语句解释
Mat src = imread("E:/minions.jpg");
///Mat 类型的 src是输入图像矩阵,若在imread的参数中加上IMREAD_GRAYSCALE,
//则是把原图以灰度图像的方式加载进来,如src = imread("E:/minions.jpg", IMREAD_GRAYSCALE);
//若对原图的输入图像src使用cvtColor(src, dst, COLOR_BGR2GRAY)可以实现相同的效果 见下图
//还有一点,是对src的检验,一般有两种
//1------if(src.empty())
//2------if(!src.data)
//两种效果是相同的
cvtColor(输入图像,输出,颜色类型)至于颜色类型有很多种,比如COLOR_BGR2GRAY转为灰度图、COLOR_BGR2HLS转为高饱和度图等,有很多,并且不同版本的opencv的命令也有所不同。建议大家根据自己opencv的版本去官网帮助文档进行查询
//namedWindow(窗口名称,窗口大小的类型),创建一个窗口,
//窗口大小一般使用WINDOWS_AUTOSIZE(不同版本有一定的区别,大家要根据自己的opencv版本进行选择输入),
//表示窗口大小根据图片大小自适应,或者也可以自己设置窗口的大小
namedWindow("改为灰度图", WINDOW_AUTOSIZE);
///imshow(窗口名称,输出矩阵),与imread相对应,用于显示窗口
//也可以不用namedWindow在前面进行声明,可以单独使用,系统会自动声明,但和namedWindow一起使用显得比较严谨
imshow("改为灰度图", dst);
//imwrite(图片名称,输出矩阵),使用imwrite可以使得经过上面代码处理过的图像以指定的名称、类型,保存在指定的本地的位置
imwrite("E:/outputimage1.jpg",dst1);
//最后是刚开始写opencv的代码很容易被忽略的一个小的语句
waitKey(0)
//使用它可以使得图像显示后停留等待你的操作,否则会一闪而过,达不到检查正误的目的,虽然很小,但很有用
各种处理后的结果图片对比:
第一篇opencv的学习笔记就这样了,我是一个初学者,如果有相关的问题大家可以评论提出或指出我的错误之处,大家一起学习,一起进步,谢谢啦。
版权声明:本文为weixin_41963310原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。