Opencv 圖像疊加 添加水印


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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM