图片批量加水印

有些情况下,我们需要给图片加上水印,而且可能不止一张图片。这个时候,我们就可以用程序来帮助我们完成任务。基本的思路也很简单:只需要将两张图片叠加在一起就可以了。读取整个文件参考了这篇不错的博文:opencv读取文件夹下的所有图片

注:本文中使用的水印图片会对原图有一定的影响,尤其黑色图片影响最大,正常情况下水印图片应该是透明的,想深究的话可以看这篇文章:OPENCV对于有alpha通道的透明背景图片的读取和图片叠加

步骤

首先读取要添加的水印图片

Mat logo_image = imread("F:/opencv/images/logo.png");//读取水印照片

用opencv 给图片加水印 opencv给视频加水印_#include


然后开始对要处理的文件夹进行读取,读取的时候

要使用的核心函数为(注意:只能处理文件夹中相同后缀名的图片,我在这里只处理了后缀名为.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函数中的相关参数):

用opencv 给图片加水印 opencv给视频加水印_opencv_02


我们处理好的图片都在我们指定的文件夹里了(o゚v゚)ノ:

用opencv 给图片加水印 opencv给视频加水印_#include_03

源代码

下面附上源码(ノ*・ω・)ノ

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