一、概述
本例子使用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