一、視頻的定義
視頻(Video)泛指將一系列靜態影像以電信號的方式加以捕捉、紀錄、處理、儲存、傳送與重現的各種技術。連續的圖像變化每秒超過24幀(frame)畫面以上時,根據視覺暫留原理,人眼無法辨別單幅的靜態畫面;看上去是平滑連續的視覺效果,這樣連續的畫面叫做視頻。視頻技術最早是為了電視系統而發展,但現在已經發展為各種不同的格式以利消費者將視頻記錄下來。網絡技術的發達也促使視頻的紀錄片段以串流媒體的形式存在於因特網之上並可被電腦接收與播放。視頻與電影屬於不同的技術,后者是利用照相術將動態的影像捕捉為一系列的靜態照片。
二、OPEN CV視頻處理流程

三、OPEN CV支持的s
1、非壓縮格式的AVI文件(或是MPEG1格式的),這個不需要裝任何插件就可以播放了。
2、DIVX格式的AVI,這也是MPEG4的一種,安裝最新的DIVX 5.21(目前最新版),就可以播放了,不過缺點是在播放之初會有一個DIVX的標記顯示幾秒。
下載地址: http://gupin.fangdown.com/soft/138.htm
3、XVID格式的AVI,這也是MPEG4的一種,可以說是從DIVX變種而來的,據說是XVID原作者不滿意DIVX商業化收費的行為,而開發的一個全Free的MPEG4編碼核心,安裝最新的XVID(1.02版)就可以播放。
下載地址: http://gupin.fangdown.com/soft/45.htm
4、ffdshow MPEG-4格式的AVI,現在越來越多的AVI都采用ffdshow MPEG-4來,集成了DIVX與XVID的一種東西(好象還支持WMV與AC3音頻),因此如果你裝了ffdshow MPEG-4,就可以不用裝XVID與DIVX等編碼核心了。另外ffdshow MPEG-4也提供豐富的濾鏡功能比如增亮,增加銳度等,最新的ffdshow MPEG-4 Video Decoder 20041012。
下載地址:http://gupin.fangdown.com/soft/383.htm
5、WMV9格式的AVI,微軟自己推出的MPEG4編碼標准,使用Windows Media 9.0就可以播放,如果沒有的話,也可以下載一個Windows Media Encoder 9.0,使你的系統支持WMV 9.0的格式。
下載地址:http://www.ogg.cn/Software/view-software-62.html
6、VP6格式的AVI,也是一種MPEG4的編碼格式,On2 Technologies開發的編碼器,VP6號稱在同等碼率下,視頻質量超過了Windows Media 9、Real 9和H.264。VP6視頻編碼器目前被中國的EVD所采用。說真的,現在用這個不多。最新版本是VP6 vfw Codec 6.2.6.0。
四、OPEN CV處理
int main() { cout << "請輸入您要運行的功能:" << endl; cout << "1:批量讀取目錄下的圖片並展示:" << endl; cout << "2:將視頻中的幀保存為圖片" << endl; cout << "3:將圖片合成為視頻" << endl; cout << "請輸入您的選擇:" << endl; int iopt; cin >> iopt; switch (iopt) { case 1://批量讀取文件目錄圖片並展示 { char filename[50] = { 0 }; char winname[50] = {"winimg"}; Mat winimg; for (int i = 1; i <= 2; i++) { snprintf(filename, 50, "C:\\dev\\res\\IMG_%d.JPG", i); //strcpy_s(winname, filename); winimg=imread(filename); if (winimg.empty()) break; imshow(winname, winimg); if (waitKey(3000) >= 0) break; } destroyAllWindows(); break; } case 2: { //將視頻拆分成圖片保存 char outfile[50] = { 0 }; VideoCapture cap; cap.open("C:\\dev\\res\\test.mp4"); if (!cap.isOpened()) { cout << "視頻打開失敗" << endl; return -1; } Mat frame; int totalframe = cap.get(CV_CAP_PROP_FRAME_COUNT); for(int i=0;i<totalframe;i++) { cap >> frame; if (frame.empty()) break; snprintf(outfile, 50, "C:\\dev\\res\\IMG_%d.jpg", i); imshow("img", frame); imwrite(outfile, frame); if (waitKey(20) >= 0) break; } destroyAllWindows(); break; } case 3://圖像合成視頻 { char filename[50] = { 0 }; Size size0 = Size(960, 540); VideoWriter writer("c:\\dev\\res\\merge.avi",CV_FOURCC('X','V','I','D'),20,size0,true); Mat frame; for (int i = 0; i < 215; i++) { snprintf(filename, 50, "C:\\dev\\res\\IMG_%d.jpg", i); frame = imread(filename); if (frame.empty()) break; imshow("winname", frame); writer << frame; } destroyAllWindows(); break; } } return 0; }
