最近一直在更新,想说一下自己写这篇博客的目的在于应用,让你通过简单的看OpenCV的一些函数原型,就能立马去使用这个函数。
1、图像的拷贝和深层次复制—copyTo()和clone()
(1)、copyTo() 方法也是深拷贝,但是会不会去申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则只深拷贝并不申请新的空间,否则先申请空间后再进行拷贝.注意:评判的准则是,大小一不一致
(2)、clone 是最简单的深复制方法,在使用这个方法的时候,会在内存中申请新的空间
用法:
Mat A = Mat::ones(4,5,CV_32F);
Mat B = A.clone() //clone 是完全的深拷贝,在内存中申请新的空间,与A独立
Mat C;
A.copyTo(C) //此处的C矩阵大小与A大小不一致,则申请新的内存空间,并完成拷贝,等同于clone()
Mat D = A.col(1);
A.col(0).copyTo(D); //此处D矩阵大小与A.col(0)大小一致,因此不会申请空间,而是直接进行拷贝,
相当于把A的第1列赋值给第二列。
2、saturate_cast( )方法
saturate_cast< uchar > : 此处为溢出保护,此处相当于在对数值进行剪切,使得只保留自己规定范围内的数值。
比如在这里, 溢出保护的范围我们定的是 <uchar>
因此,saturate_cast<uchar>( )方法就会对括号里面的数值进行剪切
(1)、当 (***) > 255时,赋值为255;
(2)、当 (***) < 0时,赋值为0;
3、setTo( ) 函数的使用
首选,setTo( )函数的原型是:Mat& setTo(InputArray value, InputArray mask=noArray());
解析:
1、功能:把矩阵mask中元素不为0的点全部变为value值;
2、当默认不添加mask的时候,表明mask是一个与原图尺寸大小一致的且元素值全为非0的矩阵,因此不加mask的时候,会将原矩阵的像素值全部赋值为value;
4、Scalar( )函数的使用
Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。
e.g. Scalar(1,2) 当用到的时候,就会在相应的像素里面赋值两个通道,里面数值为:(1,2)。
5、图像的简单运算之图像相加函数 addWeighted( )
首先来看一下,官方给的函数原型
void addWeighted(InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype = -1);
解析: src1 和src2 就是两个输入图片,dst 是最后相加得到的目标图片, 其中 alpha、beta和gamma这几个参数是表示相应的权值,具体如下:
(1)、alpha – Weight for the first array elements.
(2)、beta – Weight for the second array elements.
(3)、gamma – Scalar added to each sum.
(4)、dtype – Optional depth of the destination array. When both input arrays have the same
(5)、The function addWeighted calculates the weighted sum of two arrays as follows:
(6)、dst(I) = saturate(src1(I) alpha + src2(I) beta + gamma) ===> dst = src1*alpha + src2*beta + gamma
6、分割图像通道 split( )函数和 merge( )函数
首先来看一下,官方给的函数原型
void split(InputArray m, OutputArrayOfArrays mv);
解析: m:表示的是输入的图像,mv:表示的是,创建的一个三通道向量。
注意:
(1)、使用这个函数的时候,首先应该建立一个 三