码迷,mamicode.com
首页 > 其他好文 > 详细

opencv实现两个图片的混合

时间:2015-05-26 10:48:18      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:opencv   图像处理   

简介

  本文是将在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与第二张图片的数据。
最后显示出来,两张原图像都是之前使用过的,这里就直接展示它的效果图:
技术分享

opencv实现两个图片的混合

标签:opencv   图像处理   

原文地址:http://blog.csdn.net/u011630458/article/details/46003491

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!