視頻處理基本介紹
- 1、基本概述
- (1)opencv中視頻處理的兩個基礎類
- (2)視頻的屬性:獲取屬性和設置屬性
- 2、VideoCapture的介紹
- (1)Why( VideoCapture類的作用)
- (2)How( 如何使用VideoCapture)
- A.播放視頻文件函數
- B.播放視頻文件并實現暫停和繼續
- 3、VideoWriter類的介紹
- (1)Why(VideoWriter類的作用)
- (2)How(如何使用VideoWriter保存視頻)
- 4、總結
1、基本概述
(1)opencv中視頻處理的兩個基礎類
初學者使用opencv對視頻進行處理時,應該首先關注兩個類:VideoCapture類和VideoWriter類
- VideoCapture類:用于視頻的讀操作
- VideoWriter類:用于視頻的寫操作
(2)視頻的屬性:獲取屬性和設置屬性
- 視頻文件的當前播放位置:以毫秒為單位 -----------------------屬性id:propId = 0
- 幀索引:視頻序列中幀的索引(以0為起始索引)-------------屬性id:propId = 1
- 幀寬度/高度:像素為單位--------------------------------------------屬性id:propId = 3 / 4
- 幀率:每一秒的所放映的幀數 --------------------------------------屬性id:propId = 5
- 幀數:視頻文件的幀數(總數)------------------------------------屬性id:propId = 7
- 圖像的亮度:僅適用于相機------------------------------------------屬性id:propId = 10
- 圖像的對比度:僅適用于相機---------------------------------------屬性id:propId = 11
- 圖像的飽和度:僅適用于相機---------------------------------------屬性id:propId = 12
- 圖像的色調:僅適用于相機------------------------------------------屬性id:propId = 13
- 圖像的增益:僅適用于相機------------------------------------------屬性id:propId = 14
- 圖像的曝光:僅適用于相機------------------------------------------屬性id:propId = 15
A.獲取視頻的屬性:
double dRes = vidObj.get(propId);
B.設置視頻的屬性:
int propId = 4;
double dValue =100;
vidObj.set(propId, dValue);
2、VideoCapture的介紹
(1)Why( VideoCapture類的作用)
獲取視頻文件或攝像頭視頻
(2)How( 如何使用VideoCapture)
A.播放視頻文件函數
視頻播放函數如下(可直接使用):
/*@author @還下著雨ZG
* @brief 播放指定的視頻文件
* @param[in] strVideo, 視頻文件所在路徑
* @return int, 正表示播放成功,負數表示播放視頻文件失敗
*/
int VideoPlay(const std::string& strVideo)
{//創建VideoCapture對象cv::VideoCapture capture;//打開視頻文件capture.open(strVideo);//判斷是否打開成功if (!capture.isOpened()){std::cerr << "Failed to open video!" << std::endl;return -1;} //獲取視頻的幀率FPSdouble rate = capture.get(cv::CAP_PROP_FPS);//播放視頻cv::Mat frame;while (1){capture >> frame;if (frame.empty()){std::cout<<"播放完畢!"<<std::endl;break;}cv::imshow("Playing video...", frame);cv::waitKey(rate);}
}
B.播放視頻文件并實現暫停和繼續
視頻播放和暫停函數如下(可直接使用):
/*@author @還下著雨ZG
* @brief 播放指定的視頻文件并實現了暫停和繼續
* @param[in] strVideo, 視頻文件所在路徑
* @return int, 正表示播放成功,負數表示播放視頻文件失敗
*/
int VideoPlayAndStop(const std::string& strVideo)
{//讀取視頻文件cv::VideoCapture capture(strVideo, cv::CAP_ANY);if (!capture.isOpened()){std::cerr << "Failed to open video file!" << std::endl;return -1;}//顯示每一幀(視頻自帶幀率)cv::Mat imFrame;double dRate = capture.get(cv::CAP_PROP_FPS);int iDelay = 1000 / dRate;bool bStop = false;while (!bStop){capture >> imFrame;if (imFrame.empty()) {bStop = true;return 0;}else{imshow("MyFrame", imFrame);}int iKeyInput = cv::waitKey(iDelay);if (char(iKeyInput) == 27 ){bStop = true;}if (iKeyInput >= 0){cv::waitKey(0);}}capture.release();return 1;
}
3、VideoWriter類的介紹
(1)Why(VideoWriter類的作用)
保存修改后的視頻文件、保存攝像頭獲取的視頻序列、對待保存的視頻格式進行設置等
(2)How(如何使用VideoWriter保存視頻)
視頻保存,該函數一般是用于對視頻文件編輯之后的視頻進行保存,或保存攝像頭獲取的視頻序列(可根據實際需求做少量更改后使用):
int VideoSave(const std::string& strVideoSrc, const std::string& strVideoDst)
{//獲取視頻cv::VideoCapture capture;capture.open(strVideoSrc, cv::CAP_ANY);if (!capture.isOpened()){std::cerr << "Failed to open video file!" << std::endl;return -1;}//創建視頻錄制對象cv::VideoWriter writer;int iFourcc = writer.fourcc('M','J','P','G'); //視頻編碼格式double dFps = 25.0;cv::Mat imFrame;capture >> imFrame;if(imFrame.empty()) return -2;cv::Size SzFrame = imFrame.size();bool bIsColor = true; //彩色視頻(false表示灰色視頻)writer.open(strVideoDst,iFourcc, dFps, SzFrame, bIsColor);writer.write(imFrame);//將第一幀寫入到writer對象中int iRate = 1000/capture.get(cv::CAP_PROP_FPS); //獲取原始視頻的幀率//遍歷每一幀圖像while(1){if(!capture.read(imFrame)) break;writer.write(imFrame);cv::imshow("Frame", imFrame);if(cv::waitKey(iRate)>=0) break;}writer.release();capture.release();return 1;
}
注意:如果是需要保存攝像頭的視頻序列,應將該函數的第一個參數轉換為攝像頭的索引(0,1, …),函數內部做一定的修改即可
4、總結
- VideoCapture類的基本介紹:該類的作用、視頻屬性、對視頻每一幀進行處理、視頻播放和暫停等
- VideoWriter類的基本介紹:該類的作用、保存處理后的視頻序列、保存相機獲取的視頻序列等