算法说明:
定义感兴趣区域,然后将需要的水印复制到感兴趣区域上
我们这个地方专门加到了BGR三个通道的G通道,让整个效果更加明显
环境:VS2012+OpenCV2.4.6
源图像
效果图
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
float x,y;
//专门加到绿色通道
// read images
Mat logo= cv::imread("5.bmp",0);
Mat image1= cv::imread("boldt.jpg");
cv::namedWindow("orig");
cv::imshow("orig",image1);
// split 3-channel image into 3 1-channel images
std::vector<cv::Mat> channels;
cv::split(image1,channels);
Mat imageROI= channels.at(1);
cout<<"请输入x的位置" "x的位置范围为0到"<<image1.cols-logo.cols<<endl;
cin>>x;
//防止溢出
if((x>=0)&&(x<=image1.cols-logo.cols))
x=x;
else if(x<0)
x=0;
else x=image1.cols-logo.cols;
cout<<"请输入y的位置""y的位置范围为0到"<<image1.rows-logo.rows<<endl;
cin>>y;
if((y>=0)&&(y<=image1.rows-logo.rows))
y=y;
else if(y<0)
y=0;
else y=image1.rows-logo.rows-1;
cv::addWeighted(imageROI(cv::Rect(x,y,logo.cols,logo.rows)),1.0,
logo,0.5,0.,imageROI(cv::Rect(x,y,logo.cols,logo.rows)));
cv::merge(channels,image1);
cv::namedWindow("吃货");
cv::imshow("吃货",image1);
cv::waitKey();
return 0;
}