基础学习笔记之opencv(6):实现将图片生成视频
基礎學習筆記之opencv(6):實現將圖片生成視頻
在做實驗的過程中。難免會讀視頻中的圖片用來處理,相反將處理好的圖片又整理輸出為一個視頻文件也是非經常常使用的。
以下就來講講基于opencv的C++版本號中圖片輸出視頻是怎么實現的。
本次試驗的數據為搖擺的樹枝樹葉圖片,Waving Trees,其來源網址為:http://research.microsoft.com/en-us/um/people/jckrumm/WallFlower/TestImages.ht
該數據全由bmp圖片組成。
本次試驗的project環境為:opencv2.3.1+vs2010
實驗功能:將多張bmp彩色圖片生成一個avi格式的灰度視頻文件。
在試驗過程中。須要注意一下幾點:
1.輸出視頻文件命名的處理和視頻幀率的選擇
2.輸出視頻文件格式的選擇,好像opencv支持2種,一種是MIP1,和MJPG。
可是試驗過程中發現假設選擇MIP1不僅輸出視頻質量很差,且幀率不能控制。
3.關于視頻輸出是否為彩色問題見代碼凝視部分。
以下是project代碼:
// generate_vedio.cpp : 定義控制臺應用程序的入口點。// #include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <stdio.h> #include <iostream> using namespace cv; using namespace std; int main(int argc, unsigned char* argv[]) { String str_name="WavingTrees/b00"; char str[4]; Mat img_src,img_dst; vector<Mat> img_gray; img_src=imread("WavingTrees/b00000.bmp"); //使用VideoWriter時,假設須要寫視頻的文件不存在,則新建一個。假設存在,則必須是合法的視頻文件。否則以下的語句會報錯 //假設選擇PIM1格式時,輸出視頻的幀率不能手動選擇。且輸出視頻效果非常糟糕 //VideoWriter output_src("demo_src.avi",CV_FOURCC('P','I','M','1'),2,img.size(),1);//輸出彩色視頻 //VideoWriter output_dst("demo_dst.avi",CV_FOURCC('P','I','M','1'),25,img.size(),0);//輸出灰度視頻 //當用MJPG格式時,能夠選擇輸出的幀率,且視頻輸出的效果也要好非常多,所以一般採用這樣的格式輸出 //最后一個參數isColor假設為非0的話,則表示輸出3通道彩色視頻。否則當isColor=0時輸出為單通道黑白灰度視頻 //只是此時當放入視頻的圖片為單通道圖片時,輸出的視頻盡管是黑白灰度的,但是確同一時候有3幅圖出現,即寬度壓縮了3倍 VideoWriter output_src("demo_src.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//輸出灰度視頻 VideoWriter output_dst("demo_dst.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//輸出灰度視頻 int i=-1; namedWindow("src",WINDOW_AUTOSIZE); while(1) { i++; /****圖片名字讀取前的處理****/ _itoa_s(i,str,10); if(i<10) str_name+="00"; else if(i<100) str_name+="0"; str_name+=str; str_name+=".bmp"; if(256==i) return 0; /****輸出原彩色視頻****/ img_src=imread(str_name); if(img_src.empty()) return 0; output_src<<img_src; /****輸出目標灰色視頻****/ //這里用split函數的目的是為了給vector<Mat>型變量確定邊界,假設沒有此語句。 //則以下使用img_gray[1]就會覺得是錯誤的 split(img_src,img_gray); cvtColor(img_src,img_gray[1],CV_BGR2GRAY);//這樣輸出的是彩色視頻 //假設其他通道賦0的話,不是真正意義上的黑白灰度圖,而是背景為藍色的灰度圖 // img_gray[0]=img_gray[2]=Mat::zeros(img_src.size(),img_gray[1].type()); img_gray[0]=img_gray[2]=img_gray[1];//這樣賦值才是真正意義上的黑白灰度圖 merge(img_gray,img_dst); //但這樣輸出的盡管是灰度視頻,但是一副圖像中包括了3個一樣圖,即圖像寬度被壓縮了3倍,why? //且此時不能輸出3通道的圖片,否則生成的視頻不能播放 output_dst<<img_dst; // output_dst<<img; imshow("src",img_src); /****延時處理****/ char c=(char)waitKey(10); if(27==c) return 0; str_name="WavingTrees/b00"; } return 0; }
作者:tornadomeet 出處:http://www.cnblogs.com/tornadomeet 歡迎轉載或分享,但請務必聲明文章出處。 (新浪微博:tornadomeet,歡迎交流!
總結
以上是生活随笔為你收集整理的基础学习笔记之opencv(6):实现将图片生成视频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是dom
- 下一篇: 威马汽车申请破产审查 执行信息20多条总