如何使用opencv给视频添加水印并保存

一、概述

本例子使用opencv涉及打开视频文件,获取每帧图片,打开logo图片,给图片重置尺寸,使用addWeigh函数把logo添加到每帧图片中,输出视频文件,最后保存起来。

二、 代码

准备:关于Linux和win的opencv安装使用,可以查看下面

这里在win系统下操作,准备视频和logo,替换掉它们在代码中的路径,运行以下.cpp源文件,即可查看效果,其中保存的视频文件在项目的目录下。

#include "iostream"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char* argv[]) 
{
	//视频文件,可设置为默认摄像头
    cv::VideoCapture capture("视频文件路径");
	if (!capture.isOpened()) {
		std::cout << "video not open." << std::endl;
		return 1;
	}
	//获取当前视频帧率
	double rate = capture.get(CV_CAP_PROP_FPS);
	//当前视频帧
	cv::Mat frame;
	//每一帧之间的延时
	//与视频的帧率相对应
	int delay = 1000 / rate;
	bool stop(false);

	//创建VideoWriter做保存视频
	cv::VideoWriter writer;
	bool writer_init(false);

	//logo图片
	cv::Mat pic = cv::imread("logo图片路径");

	while (!stop) {
		if (!capture.read(frame)) {
			std::cout << "no video frame" << std::endl;
			break;
		}

		//保存视频文件
		if (!writer_init) {
			writer.open("VideoOutput.avi", CV_FOURCC('M', 'J', 'P', 'G'), rate, cv::Size(frame.cols, frame.rows));
			writer_init = true;
		}
		
		cv::Rect roi(frame.cols*0.7, frame.rows*0.7, frame.cols/4, frame.rows/4);
		cv::Mat frame_roi = frame(roi);

		cv::resize(pic, pic, cv::Size(frame.cols/4, frame.rows/4));
		cv::addWeighted(frame_roi,0, pic,1,1, frame_roi);

		//写入保存视频
		writer << frame;

		cv::imshow("video", frame);
		//引入延时
		//也可通过按键停止
		if (cv::waitKey(delay) > 0)
			stop = true;
	}
	//关闭视频,手动调用析构函数(非必须)
	capture.release();
	return 0;
}

效果如下:
在这里插入图片描述
保存的视频文件
在这里插入图片描述

三、 说明

针对代码有以下说明的地方:

  • VideoCapture可读取视频,也可获取默认摄像头(arg[0])
  • VideoWriter函数用户保存视频
  • Rect创建矩形定义roi的大小,长宽与图片重定义尺寸resize相同
  • addWeighted图片合成函数,参数情况:
    CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
    六个参数理解为:
    第1个参数src1,输入图片1
    第2个参数alpha,图片1的融合比例
    第3个参数src2,输入图片2
    第4个参数beta,图片2的融合比例
    第5个参数gamma,偏差
    第6个参数dst,输出图片
    第7个参数,dtype,输出阵列的可选深度,有默认值-1。当两个输入数组具有相同的深度时,这个参数设置为-1(默认值)。
    这里每帧图片融合为0,logo融合为1,logo实现非透明。
  • linux下运行代码的步骤如下
    1.源代码文件把视频和logo路径改为文件名
    2.把视频和图片放在当前编译目录下
    3.依次执行以下代码,AddPicToVideo.cpp为源码的文件名:
g++ -o AddPicToVideo AddPicToVideo.cpp -lopencv_highgui -lopencv_imgproc -lstdc++ -lopencv_videoio -lopencv_core -lopencv_imgcodecs

./AddPicToVideo

效果见下图:
在这里插入图片描述

参考

以上为个人整理总结的知识,如有遗漏或错误欢迎留言指出、点评,如要引用,请联系通知,未经允许谢绝转载。
[1]: https://www.runoob.com/linux/linux-system-contents.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章