(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列赋值给第二列。
saturate_cast< uchar > : 此处为溢出保护,此处相当于在对数值进行剪切,使得只保留自己规定范围内的数值。
比如在这里, 溢出保护的范围我们定的是
因此,saturate_cast( )方法就会对括号里面的数值进行剪切
(1)、当 (***) > 255时,赋值为255;
(2)、当 (***) < 0时,赋值为0;
首选,setTo( )函数的原型是:Mat& setTo(InputArray value, InputArray mask=noArray());
解析:
1、功能:把矩阵mask中元素不为0的点全部变为value值;
2、当默认不添加mask的时候,表明mask是一个与原图尺寸大小一致的且元素值全为非0的矩阵,因此不加mask的时候,会将原矩阵的像素值全部赋值为value;
Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。
e.g. Scalar(1,2) 当用到的时候,就会在相应的像素里面赋值两个通道,里面数值为:(1,2)。
首先来看一下,官方给的函数原型
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
首先来看一下,官方给的函数原型
void split(InputArray m, OutputArrayOfArrays mv);
解析: m:表示的是输入的图像,mv:表示的是,创建的一个三通道向量。
注意:
(1)、使用这个函数的时候,首先应该建立一个 三通道向量
e.g. vector planes;
(2)、然后才能执行此函数操作:
split(image,planes )
(3)、此时后就可以在得到的三通道向量planes里面进行相关的操作,比如,将一幅图片只加到 蓝色通道
e.g planes[0] += image2 ;
(4)、最后要想查看效果的话,就需要进行合成操作,在这里使用到函数: merge( )
e.g merge(planes,result) ;
result 里面就是,你所得到的图像
首先来看一下,官方给的函数原型:
void remap( InputArray src, OutputArray dst,
InputArray map1, InputArray map2,
int interpolation, int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar());
解析:
首先来看一下,官方给的函数原型:
double norm(InputArray src1, InputArray src2,
int normType = NORM_L2, InputArray mask = noArray());
解析:
首先来看一下,官方给的函数原型:
void absdiff(InputArray src1, InputArray src2, OutputArray dst);
解析: 首先这个函数可计算 当前帧与背景之差的绝对值,也就是说,我们可以认为场景大多数情况下是不变的,而只有前景(被跟踪目标)会运动,这样就可以建立背景模型,通过比较当前帧和背景模型,就能轻松的跟踪目标运动情况了
首先来看一下,官方给的函数原型:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
====> 这个函数主要的作用是:通过遍历灰度图中的点,将图像像素进行二值化,处理过后的图片只有二种色值
参数信息:
- 其它参数很好理解,我们来看看第五个参数,第五参数有以下几种类型
- 0: THRESH_BINARY 当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
- 1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
- 2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
- 3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
- 4: THRESH_TOZERO_INV 当前点值大于阈值时,设置为0,否则不改变
首先来看一下,官方给的函数原型:
int cv::floodFill( InputOutputArray _image,
InputOutputArray _mask,
Point seedPoint, /// 漫水填充起始点
Scalar newVal, /// 重绘区域的新值
Rect* rect = 0,
Scalar loDiff = Scalar(),
Scalar upDiff = Scalar(),
int flags = 4 )
首先来看一下,官方给的函数原型:
int64 getTickCount();
此函数原型非常简单,用来计算代码运行的时间,但是这个运行时间跟你所用的机器有很大的关系,所以使用这个函数来观测运行时间,最有参考价值的是相对时间。
应用实例:
const int64 start = getTickCount();
colorReduce (image1,64);
double duration = (getTickCount() - start)/getTickFrequency();
首先来看一下,官方给的函数原型:
void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop);
解析:
CMP_EQ=0, //相等
CMP_GT=1, //大于
CMP_GE=2, //大于等于
CMP_LT=3, //小于
CMP_LE=4, //小于等于
CMP_NE=5 }; //不相等
首先来看一下,官方给的函数原型:
cv::grabCut(image, //输入图像
result, //分段结果
rectangle, // 包含前景的矩形
bgModel,fgModel, // 前景、背景
1, // 迭代次数
cv::GC_INIT_WITH_RECT); // 用矩形
简单应用实例:
// 打开另一幅图像
cv::Mat image= cv::imread("/home/lm/AApracticeOpenCV/orange.jpg");
if (!image.data)
{
cout<<"不能打开图像!"<
首先来看一下,官方给的函数原型:
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
首先来看一下,官方给的函数原型:
void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst);
解析:
该函数的要点就是:如果一幅灰度图像的某个像素的灰度值在指定的高、低阈值范围之内,则在dst图像中令该像素值为255,否则令其为0,这样就生成了一幅二值化的输出图像
首先来看一下,官方给的函数原型:
CV_EXPORTS void calcHist( const Mat* images, /// 源图像
int nimages, ///源图像的个数
const int* channels, /// 列出通道
InputArray mask, /// 输入掩码
OutputArray hist, ///输出直方图
int dims, /// 直方图维度(通道数量)
const int* histSize, ///每个维度位数
const float** ranges, ///每个维度范围
bool uniform = true, ///true表示箱子间距相等
bool accumulate = false ); /// 是否在多次调用时进行累加
直方图是一个简单的表格,每个像素放在一个箱子里面
对一副 灰度图 进行直方图处理的一般步骤(调用OpenCV库函数)
for (int i =0 ; i < 256; i++ ){
cout << "Value" << i << " = " << histo.at(i) << endl;
}
h.getImageOfHistogram( image ) /// 该方法就可以得到直方图图像
首先来看一下,官方给的函数原型:
LUT(InputArray src, InputArray lut, OutputArray dst);
首先来看一下,官方给的函数原型:
void equalizeHist( InputArray src, OutputArray dst );
OpenCV提供的简单易用函数,用于直方图均衡化处理
在这里需要注意: src和dst 这两个参数就是Mat类型的图像变量。
首先来看一下,官方给的函数原型:
void cv::normalize(InputArry src,InputOutputArray dst,double alpha=1,double beta=0,int norm_type=NORM_L2,
int dtype=-1,InputArray mark=noArry())