一.功能介紹
? ? ? ? 圖像疊加:就是在一張圖片上放上自己想要的圖片,如LOGO,時間等。有點像之前提到的OSD原理一樣。例如:下圖一張圖片,在左上角增加其他圖片。
?二.OPENCV中圖像疊加常用的API
1.?copyTo方法進行圖像疊加
- 原理:在圖片1中選取一個 Rect 的興趣區域(也就是自己想要放哪,放多大),然后把圖2放在興趣區域,最后輸出圖片1。注意:這個興趣區域要和圖2一樣大小。例如:圖1為原圖,圖2為杰倫。
- ?API: void copyTo( OutputArray m ) const
- ?代碼實現:
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{//讀取圖像Mat src_pic = imread("frame1.jpg"); //src_pic是原圖像數據Mat logo_pic = imread("mat_demo.jpg");//logo_pic是LOGO圖像的數據//創建興趣區域Mat logo_pic_roi = src_pic(Rect(0,0,logo_pic.cols, logo_pic.rows)); //在src_pic上創建一個矩形區域,大小與logo_pic相同//將logo_pic復制到logo_pic_roi中logo_pic.copyTo(logo_pic_roi);//顯示圖像imwrite("result.jpg", src_pic);return 0;
}
2.?addWeighted方法對圖像數據進行圖像疊加
- 原理:和copyTo一樣,只不過多了一個加權操作(加權:1 = 圖片1的權重+圖片2的權重,誰的權重高,誰更清楚,更清晰),然后輸出新圖片。
- API:? addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, intdtype = -1);
第一個參數:src1,第一個輸入的圖像
第二個參數:alpha,第一個輸入圖像的權重值,是一個雙精度浮點數
第三個參數:src2,第二個輸入圖像
第四個參數:beta,第二個輸入圖像的權重,是一個雙精度浮點數
第五個參數:gamma 加權和的可選標量,通常是一個雙精度浮點數,默認為 0
第六個參數:dst 輸出圖像,這里是存儲加權圖像的結果
第七個參數:輸出圖像的類型,默認是-1,表示的是輸入圖像和輸出圖像類型一致
上圖是src1權重為0.8,下圖是src1權重為0.3效果:
- addWeighted的兩種情況:1.兩張圖片大小不一樣:就是先在圖片1上面創建感興趣區域,然后融合感興趣區域和圖片2,最后輸出圖片1;2.兩張圖片一樣大:直接融合兩張圖片,然后生成新圖片。
- 代碼實現:?
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char * argv[])
{Mat src1 = imread(argv[1]); //src1原圖像的數據Mat src2 = imread(argv[2]); //src2是LOGO圖像的數據//判斷src1大小和src2大小是否相同,若不同則和copyTo函數一樣操作if(src1.size != src2.size){//在src1中創建一個矩形區域(興趣區域)和src2大小相同的圖像Mat image_roi = src1(Rect(0, 0, src2.cols, src2.rows));//設置權重double alpha = 0.8;double beta = 1 - alpha;int gamma = 0;//將src2和src1的矩形區域(興趣區域)進行融合,并將結果存入image_roi中addWeighted(image_roi, alpha, src2, beta, gamma, image_roi);imwrite("addweighted3.jpg", src1);}else{//src1和src2大小相同,直接進行加權操作double alpha = 0.3;double beta = 1 - alpha;int gamma = 0;Mat dst;addWeighted(src1, alpha, src2, beta, gamma,dst);imwrite("addweighted2.jpg", dst);}return 0;
}