ROI---设定感兴趣的区域(region of interest)
定义:
Mat imageROI;
//方法一:通过Rect指定矩形区域
imageROI=image(Rect(500,250,logo.cols,logo.rows))
//方法二 指定感兴趣行或列的范围(Range)
imageROI=srcImage3(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));
利用ROI将一幅图加到另一幅图的指定位置
bool ROI_AddImage()
{
//【1】读入图像
Mat srcImage1= imread("1.jpg");
Mat logoImage= imread("2.jpg");
if(!srcImage1.data ) { printf("读取srcImage1错误~! \n"); return false; }
if(!logoImage.data ) { printf("读取logoImage错误~! \n"); return false; }
//【2】定义一个Mat类型并给其设定ROI区域
Mat imageROI= srcImage1(Rect(200,250,logoImage.cols,logoImage.rows));
//【3】加载掩模(必须是灰度图)
Mat mask= imread("2.jpg",0);
//【4】将掩膜拷贝到ROI
logoImage.copyTo(imageROI,mask);
//【5】显示结果
namedWindow("<1>利用ROI实现图像叠加示例窗口");
imshow("<1>利用ROI实现图像叠加示例窗口",srcImage1);
return true;
}
初级图像混合——线性混合操作
公式:
实现函数:addWeighted函数
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
- dst = src1[I]*alpha+ src2[I]*beta + gamma;
bool LinearBlending()
{
//【0】定义一些局部变量
double alphaValue = 0.5;
double betaValue;
Mat srcImage2, srcImage3, dstImage;
//【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )
srcImage2= imread("mogu.jpg");
srcImage3= imread("rain.jpg");
if(!srcImage2.data ) { printf("你妹,读取srcImage2错误~! \n"); return false; }
if(!srcImage3.data ) { printf("你妹,读取srcImage3错误~! \n"); return false; }
//【2】做图像混合加权操作
betaValue= ( 1.0 - alphaValue );
addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);
//【3】创建并显示原图窗口
namedWindow("<2>线性混合示例窗口【原图】 by浅墨", 1);
imshow("<2>线性混合示例窗口【原图】 by浅墨", srcImage2 );
namedWindow("<3>线性混合示例窗口【效果图】 by浅墨", 1);
imshow("<3>线性混合示例窗口【效果图】 by浅墨", dstImage );
return true;
}
分离颜色通道
split函数---将一个多通道数组分离成几个单通道数组
void split(const Mat& src, Mat*mvbegin); void split(InputArray m,OutputArrayOfArrays mv); //第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。 //第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。
merge函数---将多个数组组合合并成一个多通道的数组。
它通过组合一些给定的单通道数组,将这些孤立的单通道数组合并成一个多通道的数组,从而创建出一个由多个单通道阵列组成的多通道阵列
void merge(const Mat* mv, size_tcount, OutputArray dst) void (InputArrayOfArrays mv,OutputArray dst)
创建轨迹条——createTrackbar函数
int createTrackbar(conststring& trackbarname, conststring& winname,
int* value, int count, TrackbarCallback onChange=0,void* userdata=0);
//创建轨迹条
createTrackbar("对比度:", "【效果图窗口】",&g_nContrastValue,
300,ContrastAndBright );// g_nContrastValue为全局的整型变量,ContrastAndBright为回调函数的函数名(即指向函数地址的指针)
获取当前轨迹条的位置——getTrackbarPos函数
int getTrackbarPos(conststring& trackbarname, conststring& winname);