ROI区域:设置感兴趣区域(region of interest);
使用ROI区域可以减少处理时间,增加精度。
方法一:使用表示矩阵区域Rect,它指定左上角坐标和矩阵的长和宽;
Mat imageROI;
imageROI = image(Rect(200, 200, logo.cols, logo.rows));
方法二:指定感兴趣行或列的范围(Range),Range是指定起始索引到终止索引(不包含终止索引)的一段连续序列。
Mat imageROI;
imageROI = image(Range(250,250+logo.rows), Range(200, 200+logo.rows));
void ROI_AddImage()
{
Mat srcImage = imread("G:\\Opencv\\素材\\瓦力.jpg");
Mat logoImage = imread("G:\\Opencv\\素材\\my_logo.png");
//创建ROI区域的第一种方法
//Mat imageROI = srcImage(Rect(100, 200, logoImage.cols, logoImage.rows));
//创建ROI区域的第二种方法
Mat imageROI = srcImage(Range(200, 200 + logoImage.rows), Range(100, 100 + logoImage.cols));
Mat mask = imread("G:\\Opencv\\素材\\my_logo.png",0);
logoImage.copyTo(imageROI, mask);
namedWindow("<1>利用ROI实现图像叠加示例窗口");
imshow("<1>利用ROI实现图像叠加示例窗口", srcImage);
waitKey(0);
}
线性混合操作是一种典型的二元(两个输入)的像素操作,其理论公式为:
g(x) = (1-a) f1(x) + af2(x)
在Opencv中使用addWeighted函数实现。
void addWeighted(InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype=-1);
第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。
第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第六个参数,gamma, 一个加到权重总和上的标量值。看下面的式子自然会理解。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
addWeighted函数计算两个数组的加权和:
用数学公式表示就是:dst = src1[i] *alpha +src2[i]*beta +gama
void main()
{
double alphaValue = 0.5;
double betaValue;
Mat srcImage1, srcImage2, dstImage;
srcImage1 = imread("mogu.jpg");
srcImage2 = imread("rain.jpg");
if (!srcImage1.data)
{
printf("第一幅图加载失败!");
}
if (!srcImage2.data)
{
printf("第二幅图加载失败!");
}
betaValue = 1.0 - alphaValue;
addWeighted(srcImage1, alphaValue, srcImage2, betaValue, 3.0, dstImage);
namedWindow("原图1");
imshow("原图1", srcImage1);
namedWindow("原图2");
imshow("原图2", srcImage2);
namedWindow("效果图");
imshow("效果图", dstImage);
waitKey(0);
}