如何使用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

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