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