OPENCV学习笔记(1)—自学OPENCV—Mat对象的详细介绍以及第一段代码详解

  • Post author:
  • Post category:其他




代码

先上代码。

我自学的方式是先看代码,然后在代码中遇到不懂的再逐个查询资料,深入学习,直到学懂。大家按照符合自己的方式学习就好了,适合自己的才是最好的。共勉。

#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对象的参数主要是以下几种形式:

  1. (int rows, int cols, int type)(行数,列数,类型);
  2. (int size, int type) (大小,类型);
  3. (int rows, int cols, int type, const Scalar &s)
  4. (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对象的特点

  1. 输出图像的内存是自动分配的;
  2. 使用opencv的c++接口,不需要考虑内存分配的问题;
  3. 赋值和拷贝构造函数只会复制头部(也就是部分复制);
  4. 使用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 版权协议,转载请附上原文出处链接和本声明。