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