利用Qt+opencv實(shí)現(xiàn)視頻分解為圖片
最近遇到一些售前提供的BUG,但是他們提供的是錄像視頻,因?yàn)樘幚盹@示速度比較快,因此很難找到出現(xiàn)問題的位置。需要反復(fù)播放,自己編寫了一個視頻分解成圖片這樣就可以一張圖一張圖的對比,方便查看。
開發(fā)環(huán)境
qt+openvc
sudo apt install libopencv-dev
源碼說明
引用opencv動態(tài)庫
.pro文件需要添加opencv的動態(tài)庫
LIBS += -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs
Qt代碼
將視頻分解成每一幀,然后將每一幀保存位圖片。
void MainWindow::slotClickBtn() { // 打開視頻文件 cv::VideoCapture video("/pan/錄屏_選擇區(qū)域_20231227104611.mp4"); // 檢查視頻是否成功打開 if (!video.isOpened()) { std::cerr << "無法打開視頻文件" << std::endl; } // 讀取視頻的幀率和總幀數(shù) double fps = video.get(cv::CAP_PROP_FPS); int totalFrames = video.get(cv::CAP_PROP_FRAME_COUNT); // 逐幀讀取視頻并保存為圖像文件 for (int frameNumber = 0; frameNumber < totalFrames; ++frameNumber) { cv::Mat frame; video.read(frame); // 檢查是否成功讀取幀 if (frame.empty()) { std::cerr << "無法讀取視頻幀" << std::endl; break; } // 生成圖像文件名,例如 frame_0001.jpg std::string filename = "frame_" + std::to_string(frameNumber + 1) + ".jpg"; // 保存幀為圖像文件 cv::imwrite(filename, frame); } // 關(guān)閉視頻文件 video.release(); std::cout << "視頻分解完成,共生成 " << totalFrames << " 張圖像文件。" << std::endl; }
源代碼地址
https://gitcode.net/arv002/qt/-/tree/master/opencv/VideoDecomposition
擴(kuò)展
VideoCapture 詳解
cv::VideoCapture
是 OpenCV 中用于從視頻文件、攝像頭或圖像序列中捕獲幀的類。它提供了一種方便的方式來處理視頻流和圖像序列。
以下是一些關(guān)于 cv::VideoCapture
的主要方法和屬性的詳細(xì)說明:
構(gòu)造函數(shù)
cv::VideoCapture(const cv::String& filename); cv::VideoCapture(int index);
filename
:視頻文件的路徑,可以是本地文件路徑或網(wǎng)絡(luò) URL。
index
:攝像頭的索引。通常,0 表示默認(rèn)攝像頭,1 表示第二個攝像頭,以此類推。
成員函數(shù)
bool open(const cv::String& filename);
打開視頻文件。返回 true
表示成功打開,false
表示失敗。
bool isOpened() const;
檢查視頻是否成功打開。返回 true
表示成功打開,false
表示失敗。
void release();
釋放資源。關(guān)閉視頻文件或釋放攝像頭。
bool read(cv::OutputArray image);
從視頻流中讀取一幀。返回 true
表示成功讀取,false
表示讀取失敗或到達(dá)視頻末尾。
double get(int propId) const;
獲取視頻流的屬性值,例如幀率、寬度、高度等。propId
是屬性標(biāo)識符,例如 cv::CAP_PROP_FPS
表示幀率。
bool set(int propId, double value);
設(shè)置視頻流的屬性值。propId
是屬性標(biāo)識符,value
是要設(shè)置的值。
示例用法
#include <opencv2/opencv.hpp> #include <iostream> int main() { cv::VideoCapture cap("path/to/your/video.mp4"); if (!cap.isOpened()) { std::cerr << "無法打開視頻文件" << std::endl; return -1; } double fps = cap.get(cv::CAP_PROP_FPS); int width = cap.get(cv::CAP_PROP_FRAME_WIDTH); int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); std::cout << "幀率: " << fps << ",寬度: " << width << ",高度: " << height << std::endl; cv::Mat frame; while (cap.read(frame)) { // 處理每一幀 cv::imshow("Frame", frame); cv::waitKey(30); // 等待30毫秒 } cap.release(); cv::destroyAllWindows(); return 0; }
上述代碼演示了如何打開視頻文件、獲取視頻屬性、逐幀讀取視頻并顯示。請根據(jù)實(shí)際需求調(diào)整。
到此這篇關(guān)于利用Qt+opencv實(shí)現(xiàn)視頻分解為圖片的文章就介紹到這了,更多相關(guān)Qt opencv視頻分解為圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)例真題講解數(shù)據(jù)結(jié)構(gòu)中單向環(huán)形鏈表
鏈表可以說是一種最為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)了,而單向鏈表更是基礎(chǔ)中的基礎(chǔ)。鏈表是由一組元素以特定的順序組合或鏈接在一起的,不同元素之間在邏輯上相鄰,但是在物理上并不一定相鄰。在維護(hù)一組數(shù)據(jù)集合時,就可以使用鏈表,這一點(diǎn)和數(shù)組很相似2022-04-04C++調(diào)用libcurl開源庫實(shí)現(xiàn)郵件的發(fā)送功能流程詳解
libcurl是一個免費(fèi)開源的網(wǎng)絡(luò)傳輸庫,支持ftp、ftps、tftp,http、https、telnet、ldap、pop3、smtp等多種協(xié)議,接下來讓我們一起來了解吧2021-11-11C語言開發(fā)實(shí)現(xiàn)通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言開發(fā)實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08Qt實(shí)現(xiàn)可以計(jì)算大數(shù)的簡單計(jì)算器
計(jì)算器是我們生活中很常見的東西,它可以由多種語言多種方式來實(shí)現(xiàn)。本文主要介紹的是基于C++語言,由QT實(shí)現(xiàn)的可以計(jì)算大數(shù)的簡單計(jì)算器,需要的可以參考一下2022-12-12C++容器適配與棧的實(shí)現(xiàn)及dequeque和優(yōu)先級詳解
這篇文章主要介紹了C++容器適配與棧的實(shí)現(xiàn)及dequeque和優(yōu)先級,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10C語言數(shù)據(jù)結(jié)構(gòu)線性表教程示例詳解
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)線性表的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02