赞
踩
有些情况下,我们需要给图片加上水印,而且可能不止一张图片。这个时候,我们就可以用程序来帮助我们完成任务。基本的思路也很简单:只需要将两张图片叠加在一起就可以了。读取整个文件参考了这篇不错的博文:opencv读取文件夹下的所有图片
注:本文中使用的水印图片会对原图有一定的影响,尤其黑色图片影响最大,正常情况下水印图片应该是透明的,想深究的话可以看这篇文章:OPENCV对于有alpha通道的透明背景图片的读取和图片叠加
首先读取要添加的水印图片
Mat logo_image = imread("F:/opencv/images/logo.png");//读取水印照片
然后开始对要处理的文件夹进行读取,读取的时候
要使用的核心函数为(注意:只能处理文件夹中相同后缀名的图片,我在这里只处理了后缀名为.jpg的图片):
glob(pattern_jpg, image_files);
读取到要进行处理的图片后,首先要对水印图片进行尺寸的变化,因为addWeighted函数只能叠加两张相同尺寸的图片:
//将水印图片更改为与读取图片大小相同尺寸,以便进行下一步的线性相加
Mat logo_image_resize;
resize(logo_image, logo_image_resize, src.size());
//将两张图片进行线性相加
Mat mix_image;
addWeighted(src, 0.9, logo_image_resize, 0.1, 0, mix_image);
给当前图片加好水印后,我们就可以将图片保存到我们指定的文件夹中:
//依次将加上水印后的图片存储到指定的文件夹中
string img_name = "F:/image/image" + to_string(i) + ".jpg";
imwrite(img_name, mix_image);
然后继续循环,直到该文件夹内所有的图片都处理完毕。
下面附上一张效果图(如果觉得水印效果不明显的话,可以更改addWeighted函数中的相关参数):
我们处理好的图片都在我们指定的文件夹里了(o゚v゚)ノ:
下面附上源码(ノ*・ω・)ノ
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat logo_image = imread("F:/opencv/images/logo.png");//读取水印照片 //读取文件中的图片 string pattern_jpg; vector<String> image_files; pattern_jpg = "F:/opencv/images/*.jpg"; glob(pattern_jpg, image_files); for (int i = 0; i < image_files.size(); i++){ Mat src = imread(image_files[i]); //将水印图片更改为与读取图片大小相同尺寸,以便进行下一步的线性相加 Mat logo_image_resize; resize(logo_image, logo_image_resize, src.size()); //将两张图片进行线性相加 Mat mix_image; addWeighted(src, 0.9, logo_image_resize, 0.1, 0, mix_image); //依次将加上水印后的图片存储到指定的文件夹中 string img_name = "F:/image/image" + to_string(i) + ".jpg"; imwrite(img_name, mix_image); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。