获取视频的每一帧,并保存为.jpg图片
生活随笔
收集整理的這篇文章主要介紹了
获取视频的每一帧,并保存为.jpg图片
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include<opencv2\opencv.hpp>
#include <iostream>
#include <stdio.h>
#include<fstream> using namespace std;
using namespace cv;//獲取視頻中的人臉int main()
{//打開視頻文件:其實就是建立一個VideoCapture結構 VideoCapture capture("1.mp4");//檢測是否正常打開:成功打開時,isOpened返回ture if (!capture.isOpened())cout << "fail toopen!" << endl;//獲取整個幀數 long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);cout << "整個視頻共" << totalFrameNumber << "幀" << endl;//設置開始幀() long frameToStart = 1;capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);cout << "從第" << frameToStart << "幀開始讀" << endl;//設置結束幀 int frameToStop = 30;if (frameToStop < frameToStart){cout << "結束幀小于開始幀,程序錯誤,即將退出!" << endl;return -1;}else{cout << "結束幀為:第" << frameToStop << "幀" << endl;}//獲取幀率 double rate = capture.get(CV_CAP_PROP_FPS);cout << "幀率為:" << rate << endl;//定義一個用來控制讀取視頻循環結束的變量 bool stop = false;//承載每一幀的圖像 Mat frame;//顯示每一幀的窗口 namedWindow("Extractedframe");//兩幀間的間隔時間: //int delay = 1000/rate; double delay = 1000 / rate;//利用while循環讀取幀 //currentFrame是在循環體中控制讀取到指定的幀后循環結束的變量 long currentFrame = frameToStart;//濾波器的核 int kernel_size = 3;Mat kernel = Mat::ones(kernel_size, kernel_size, CV_32F) / (float)(kernel_size*kernel_size);while (!stop){//讀取下一幀 if (!capture.read(frame)){cout << "讀取視頻失敗" << endl;return -1;}cout << "正在讀取第" << currentFrame << "幀" << endl;imshow("Extractedframe", frame);cout << "正在寫第" << currentFrame << "幀" << endl;stringstream str;str << currentFrame << ".jpg";cout << str.str() << endl;imwrite(str.str(), frame);//waitKey(intdelay=0)當delay≤ 0時會永遠等待;當delay>0時會等待delay毫秒 //當時間結束前沒有按鍵按下時,返回值為-1;否則返回按鍵 //int c = waitKey(delay);int c = waitKey(1000);//按下ESC或者到達指定的結束幀后退出讀取視頻 if ((char)c == 27 || currentFrame > frameToStop){stop = true;}//按下按鍵后會停留在當前幀,等待下一次按鍵 if (c >= 0){waitKey(0);}currentFrame++;}//關閉視頻文件 capture.release();waitKey(0);return 0;
}
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的获取视频的每一帧,并保存为.jpg图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 链表划分为左小、中相等、右大
- 下一篇: 二叉树的先序/中序/后序(递归、非递归)