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