简介
本文是将在opencv上使用ROI和addWeighted来对两个图片进行混合操作。
ROI
首先看下使用ROI的实现。 在《在图像需要位置画方框_opencv(1)(2014-11-25)》中,我们已经讲了ROI的使用,这里就直接看代码了。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <math.h> #include <string.h> #include <opencv/cv.h> #include <stdio.h> int main(int argc,char *argv[]){ cv::Mat src1 = cv::imread(argv[1]); cv::Mat src2 = cv::imread(argv[2]); cv::Mat imageROI= src1(cv::Rect(200,250,src2.cols,src2.rows)); src2.copyTo(imageROI); cv::namedWindow("dst"); cv::imshow("dst",src1); cv::waitKey(0); return 0; }
代码首先是打开了两张图片,接着将第二张图片加到了第一张图片指定的位置上,效果如下。
第一张图片:
第二张图片:
混合后的效果图片:
addWeighted
讲这个方法之前,首先需要看一个公式: g(x) = (1 - a)f0(x) + af1(x) 它的意思是:对两幅图像(f0(x)和f1(x))或两段视频(同样为(f0(x)和f1(x))产生时间上的画面叠化(cross-dissolve)效果。 核心函数如下: void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1); src1:需要混合的第一张图片。 alpha:第一张图片的权重。 src2:需要混合的第二张图片。 beta:第二张图片的权重。 gamma:一个加到权重总和上的标量值。 可以看如下公式:dst = src1[I]*alpha+ src2[I]*beta + gamma; dst:混合后的目标图片。 dtype:输出阵列的可选深度。
使用该方法进行混合的代码如下:
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <math.h> #include <string.h> #include <opencv/cv.h> #include <stdio.h> int main(int argc,char *argv[]){ cv::Mat src1 = cv::imread(argv[1]); cv::Mat src2 = cv::imread(argv[2]); cv::Mat dst; double alpha = 0.5; double beta; double input; beta = (1.0 - alpha); addWeighted(src1, alpha, src2, beta, 0.0, dst); cv::namedWindow("dst"); cv::imshow("dst",dst); cv::waitKey(0); return 0; }
注意:addWeighted混合的图像必须有相同的size。使用该代码是按0.5的权重进行混合,混合效果如下:
两张用来混合的源图像:
混合出来的效果图如下:
ROI和addWeighted共同作用
最后是同时使用这这种办法,来实现将一张图片,以权重方式加到另一张图片指定位置处。 代码如下:
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <math.h> #include <string.h> #include <opencv/cv.h> #include <stdio.h> int main(int argc,char *argv[]){ cv::Mat src1 = cv::imread(argv[1]); cv::Mat src2 = cv::imread(argv[2]); cv::Mat dst; double alpha = 0.5; double beta; double input; cv::Mat imageROI = src1(cv::Rect(200,250,src2.cols,src2.rows)); beta = (1.0 - alpha); addWeighted(imageROI, alpha, src2, beta, 0.0, imageROI); cv::namedWindow("dst"); cv::imshow("dst",src1); cv::waitKey(0); return 0; }
代码中,使用ROI在第一张图片(200,250)的位置,取出了一个第二张图片大小的矩形。接着使用addWeighted以0.5的权重混合ROI与第二张图片的数据。 最后显示出来,两张原图像都是之前使用过的,这里就直接展示它的效果图:
时间: 2024-10-06 05:25:35