1)读入图片---imread()
Mat imread(const String& filename,int flags = IMREAD_COLOR);
理解函数第一步理解参数:
①读图片地址
函数识别不是依靠文件的后缀名,而是依靠内容的编码格式;
const string&filename 是一个常引用;
这里先解释一下引用的概念和为什么要使用引用?优势何在?
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
首先要明白,单纯给某个变量取别名用处不大,
引用主要用于函数参数传递中,为了解决大块数据或对象的传递效率和空间不如意的问题
引用作为函数参数
引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为 这样可以避免将整块数据全部压栈,可以提高程序的效率。
例:
void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用
{ int p; p=p1; p1=p2; p2=p; }
main( )
{
int a,b;
cin>>a>>b; //输入a,b两变量的值
swap(a,b); //直接以变量a和b作为实参调用swap函数
cout<<a<< ' ' <<b; //输出结果
}
总结:形参传递,指针传递,引用传递函数参数的区别:
形参传递函数参数:当发生函数调用时,首先要给形参分配内存单元,再将实参复制到形参的内存单元中,分两步走。很明显的劣势就是,当实参的传递的数据量很大时,显然效率很低。
指针传递函数参数:当发生函数调用时,同样首先要给形参分配存储单元,(分配一个指针变量用来存放指向实参的地址);相较于上一种方法,它2省掉了复制实参这一过程,效率提高了;但是还存在一个问题,需要使用指针变量名进行操作,降低了阅读性,程序的可读性变差,易出错。
引用传递函数参数:使用引用与传递指针所达到的效果是一样的;
先定义int a,b; 当发生函数调用swap(a,b)时; 背调函数的形参由于是引用,所以被调函数的形参的地址就是实参的地址,这样就连在使用指针作为函数参数的分配存储单元用来存放实参地址的那一步也省略掉了,相较于使用第一种方法同时省略掉了两步,效率提高了很多。
所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
常引用
常引用声明方式:const 类型标识符 &引用名=目标变量名;
用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
【例3】:
int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确
引用作为返回值格式:
类型标识符 &函数名(形参列表及类型说明)