歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenCV2 圖像疊加 給照片添加水印

C++: void Mat::copyTo(OutputArray m) const
C++: void Mat::copyTo(OutputArray m, InputArray mask) const
這個函數可以復制圖像到另一個圖像或矩陣上,可選參數是掩碼
由於疊加的圖像大小不一定相等,比如我們這裡把一張小照片加到一張大照片上
我們可以在大照片上設置一個和小照片一樣大的感興趣區域
不使用掩碼的時候,我們載入一張png,和一張jpg
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>

int main(){
cv::Mat image = cv::imread("E:/Image/Fruits.jpg");
cv::Mat logo = cv::imread("E:/logo.png");
cv::Mat imageROI;
imageROI = image(cv::Rect(10,10,logo.cols,logo.rows));
logo.copyTo(imageROI);
cv::namedWindow("result");
cv::imshow("result",image);
cv::waitKey();
return 0;
}

原先在png裡面是透明的地方,現在成了黑色,可見原來是透明的地方被認為是值0。
我們使用掩碼來看看效果,掩碼就使用png圖片,掩碼只能是一個通道的,我們載入灰度圖像作為掩碼
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>

int main(){
cv::Mat image = cv::imread("E:/Image/Fruits.jpg");
cv::Mat logo = cv::imread("E:/logo.png");
cv::Mat mask = cv::imread("E:/logo.png",0);
cv::Mat imageROI;
imageROI = image(cv::Rect(10,10,logo.cols,logo.rows));
logo.copyTo(imageROI,mask);
cv::namedWindow("result");
cv::imshow("result",image);
cv::waitKey();
return 0;
}

這樣能看出差別了吧。
再來看看另一個函數
C++: void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
轉換成數學表達式就是

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>

int main(){
cv::Mat image = cv::imread("E:/Image/Fruits.jpg");
cv::Mat logo = cv::imread("E:/logo.png");
cv::Mat imageROI;
imageROI = image(cv::Rect(10,10,logo.cols,logo.rows));
cv::addWeighted(imageROI, 1.0, logo, 0.3, 0, imageROI);
cv::namedWindow("result");
cv::imshow("result",image);
cv::waitKey();
return 0;
}

Copyright © Linux教程網 All Rights Reserved