通過OpenCV等計算機視覺工具,開發者可以像處理靜態圖像一樣對視頻流逐幀分析:從簡單的裁剪、旋轉、色彩校正,到復雜的穩像、目標跟蹤、超分辨率重建。而如何將處理后的高幀率、高動態范圍數據高效壓縮并封裝為通用格式(如MP4、AVI),則決定了成果能否跨越設備與平臺無縫傳播。
到這里,我們已經學會了如何調用攝像頭以及播放視頻,接下來是視頻的屬性及處理后如何保存。
對于視頻來說,其實就是每一幀的圖片,那么視頻也是有寬和高的,還有視頻的幀率以及這個視頻總共有多少幀圖片。
1.寬高
int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);
當然,我們也可以通過set設置我們想要的寬高,但是必須是硬件支持對應的寬高比;?
int frame_width = capture.set(CAP_PROP_FRAME_WIDTH);int frame_height = capture.set(CAP_PROP_FRAME_HEIGHT);
2.總共幀率
這段代碼就是獲取這個導入視頻的總共幀率。 如果調用攝像頭理論就是-1。
int count = capture.get(CAP_PROP_FRAME_COUNT);
3.實時幀率?
這段代碼就是獲取視頻的實時幀率。?
int fps = capture.get(CAP_PROP_FPS);
那么整體代碼如下:這里我打印了相關信息,以便驗證
void Demo::video_Demo(Mat &image)
{VideoCapture capture(0);int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);int fps = capture.get(CAP_PROP_FPS);int count = capture.get(CAP_PROP_FRAME_COUNT);cout<<"frame_width:"<<frame_width<<endl;cout<<"frame_height:"<<frame_height<<endl;cout<<"fps:"<<fps<<endl;//每秒多少怎幀cout<<"count:"<<count<<endl;//總共有多少幀Mat frame;while (1){capture.read(frame);if (frame.empty())break;// Do somethingflip(frame,frame,1);colorspace_Demo(frame);int c = waitKey(10);if (c == 27){capture.release();//釋放攝像頭break; }}
}
運行結果:當我們調用攝像頭,總幀率count給的就是-1,而導入視頻時,就會給出確切的視頻總幀率。
?
視頻保存
?首先我們需要實例化一個保存的類VideoWriter
VideoWriter save("/home/xlh/c++code/2.MP4",VideoWriter::fourcc('a','v','c','1'),
fps,Size(frame_width,frame_height),true);
?第一個參數是保存的路徑,第二個參數是視頻的編碼方式,第三個是視頻的實時幀率,第四個是視頻的寬高比。
緊接著我們只需要在每一幀處理后的代碼加上一個方法調用就可以保存視頻了。
void Demo::video_Demo(Mat &image)
{VideoCapture capture("/home/xlh/c++code/1.webm");int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);int fps = capture.get(CAP_PROP_FPS);int count = capture.get(CAP_PROP_FRAME_COUNT);cout<<"frame_width:"<<frame_width<<endl;cout<<"frame_height:"<<frame_height<<endl;cout<<"fps:"<<fps<<endl;//每秒多少怎針cout<<"count:"<<count<<endl;//總共有多少針VideoWriter save("/home/xlh/c++code/2.MP4",VideoWriter::fourcc('a','v','c','1'),fps,Size(frame_width,frame_height));Mat frame;while (1){capture.read(frame);if (frame.empty())break;// Do somethingflip(frame,frame,1);colorspace_Demo(frame);save.write(frame);//視頻保存int c = waitKey(10);if (c == 27){capture.release();//釋放攝像頭save.release();break; }}
}
這里后改動的地方是?save.write(frame);以及save.release();我們保存完成后就要釋放這個資源。
?這樣就完成保存了。
這里我運行后已經保存了我的視頻為2.MP4。
?