opencv實現兩個圖片的混合,opencv實現圖片

來源:互聯網
上載者:User

opencv實現兩個圖片的混合,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與第二張圖片的資料。最後顯示出來,兩張原映像都是之前使用過的,這裡就直接展示它的:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.