一、知識點
1、VideoCapture類
? (1)、用于從視頻文件、攝像機或圖像序列中捕獲視頻幀。
??
? (2)、構造函數 VideoCapture(const String & filename, int apiPreference = CAP_ANY)
? ? ? a、filename可以是視頻文件的名稱(例如"video.avi"),可以是圖像序列(例如"img%02.jpg", 它將讀取"img00.jpg"、"img01.jpg"、"img02.jpg"等),還可以是URL。
? ? ? b、apiPreference是實際執行捕獲的API后端,VideoCaptureAPIs枚舉值,如: CAP_ANY、CAP_FFMPEG、CAP_IMAGES等。
?? ? ?
? (3)、構造函數 VideoCapture(int index, int apiPreference = CAP_ANY)
? ? ? a、打開攝像頭進行視頻拍攝。
?? ? ?b、index是視頻捕獲設備的索引,默認攝像頭傳遞0。
?? ? ?c、apiPreference是實際執行捕獲的API后端,VideoCaptureAPIs枚舉值,如: CAP_ANY、CAP_FFMPEG、CAP_IMAGES等。
?? ? ?
? (4)、成員函數 virtual bool read(OutputArray image)
? ? ? a、抓取、解碼并返回一個視頻幀。
?? ? ?b、image為返回的視頻幀。 如果沒有抓取任何幀,則圖像為空,返回false。
??
? (5)、成員函數 virtual void release();
? ? ? a、關閉視頻文件或捕獲設備。
?? ? ?
? (6)、成員函數 double get(int propId) const;
? ? ? a、用于檢索視頻流的各種屬性值。
?? ? ?b、propId是VideoCaptureProperties枚舉值。
?? ? ?c、VideoCaptureProperties的具體值如:
?? ? ? ?CAP_PROP_FRAME_WIDTH=3,//視頻流中幀的寬度
?? ??? ?CAP_PROP_FRAME_HEIGHT=4,//視頻流中幀的高度
?? ??? ?CAP_PROP_FPS=5,//幀率
?? ??? ?CAP_PROP_FOURCC=6,//4個字符的編解碼器代碼
?? ??? ?CAP_PROP_FRAME_COUNT=7,//視頻文件中的幀數
?? ??? ?
?? ? ?
2、視頻分辨率
? (1)、P,Progressive,逐行掃描,即視頻縱向的像素行數。
? ? ? 如720P,分辨率為1280 * 720像素。
?? ? ?如1080P,分辨率為1920 * 1080像素。
? (2)、K,視頻橫向的像素列數。
? ? ? 如2K,分辨率為2560 * 1440像素。
?? ? ?如4K,分辨率為3840 * 2160 或 4096 * 2160像素。
?? ? ?如8K,分辨率為7680 * 4320像素。
? (3)、MP,百萬像素,即像素行數和列數相乘后的結果。
? ? ? 如2MP,是1920 * 1080 = 2073600像素,約等于2MP。
? (4)、超高清(Ultra HD),4K分辨率,3840 * 2160。
? ? ? 全高清(Full HD),1080P分辨率,1920 * 1080。
?? ? ?高清(HD),720P分辨率,1280 * 720。
?? ? ?標清(SD),480P分辨率,720 * 480。
?? ? ?
3、視頻碼率
? (1)、碼率指視頻在單位時間內傳輸或處理的數據量,單位通常是比特每秒(bps)、千比特每秒(Kbps)、兆比特每秒(Mbps)。
? (2)、它是影響視頻質量和文件大小的核心參數。
? (3)、碼率的本質是視頻數據壓縮程度的體現,在視頻編碼過程中,編碼器通過算法將原始圖像信息壓縮為更小的數據流。
? (4)、碼率越高,壓縮程度越低,圖像細節保留越多,文件體積越大; 反之,低碼率會犧牲畫質但節省存儲空間和帶寬。
??
4、視頻幀速率
? (1)、視頻幀速率,簡稱FPS,代表視頻每秒內顯示的圖像幀數。
? (2)、幀速率越高,畫面越流暢,但也需要更多的數據量來存儲和傳輸。
??
5、視頻分辨率、碼率、幀速率關系:
? (1)、相同分辨率和幀速率下,碼率越高,視頻畫面質量越出色。
? (2)、相同的分辨率和碼率下,合理范圍內,幀速率越高,視頻畫面流暢度越好。(超出合理范圍容易出現卡頓)
? (3)、相同的幀速率和碼率下,合理范圍內,分辨率越高,視頻畫面清晰度越高。(超出合理范圍容易出現噪點和模糊)
??
6、VideoWriter類
? (1)、用于編寫視頻文件或圖像序列。
? (2)、構造函數 VideoWriter(const String & filename, int fourcc, double fps, Size frameSize, bool isColor = true)
? ? ? filename: 輸出視頻文件的名稱。
?? ? ?fourcc: 壓縮幀的編解碼器。
? ? ? fps: 輸出視頻流的幀率。
?? ? ?frameSize: 視頻幀的大小。
?? ? ?isColor: true編碼器期望編碼彩色幀,false使用灰度幀。
? (3)、成員函數 virtual void write(InputArray image)
? ? ? a、將指定的圖像寫入視頻文件。
?? ? ?b、image表示要寫入的圖像,一般彩色圖像采用BGR格式,大小和構造時指定的frameSize一樣。
? (4)、virtual void release()
? ? ? a、釋放資源。
?? ? ?
7、注意:
? (1)、OpenCV不處理音頻。
? (2)、OpenCV處理視頻有大小限制,理論上不要超過2G。
二、示例代碼
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{cv::VideoCapture capture("../images/video.mp4");double frame_width = capture.get(cv::CAP_PROP_FRAME_WIDTH);double frame_height = capture.get(cv::CAP_PROP_FRAME_HEIGHT);double count = capture.get(cv::CAP_PROP_FRAME_COUNT);double fps = capture.get(cv::CAP_PROP_FPS);std::cout << "frame_width = " << frame_width << std::endl;std::cout << "frame_height = " << frame_height << std::endl;std::cout << "count = " << count << std::endl;std::cout << "fps = " << fps << std::endl;cv::VideoWriter writer("C:/Users/ml/Desktop/new_video.mp4", capture.get(cv::CAP_PROP_FOURCC), fps, cv::Size(frame_width, frame_height), true);cv::Mat frame;while (true){capture.read(frame);if (frame.empty()){break;}cv::imshow("視頻演示", frame);writer.write(frame);//此處時間影響"視頻演示"窗口的圖片流顯示快慢int c = cv::waitKey(33);if (c == 27){break;}}capture.release();writer.release();return 0;
}