4、【opencv入门】读取视频、读取摄像头
生活随笔
收集整理的這篇文章主要介紹了
4、【opencv入门】读取视频、读取摄像头
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、介紹
視頻讀取本質上就是讀取圖像,因為視頻是由一幀一幀圖像組成的。1秒24幀基本就能流暢的讀取視頻了。
1、讀取視頻有兩種方法:
(1) VideoCapture cap;
cap.open(“1.avi”);
(2) VideoCapture cap(“1.avi”);
2、循環顯示每一幀:
1 while(1)
2 {
3 Mat frame; //定義Mat變量,用來存儲每一幀
4 cap>>frame; //讀取當前幀方法一
5 //cap.read(frame); //讀取當前幀方法二
6 imshow(“視頻顯示”, frame); //顯示一幀畫面
7 waitKey(30); //延時30ms
8 }
二、讀取視頻
【示例】
1 //讀取視頻
2 #include<opencv2/core/core.hpp>
3 #include<opencv2/imgproc/imgproc.hpp>
4 #include<opencv2/highgui/highgui.hpp>
5 #include<iostream>
6
7 using namespace std;
8 using namespace cv;
9
10 int main(){
11 VideoCapture cap;
12 cap.open("../../1.mp4"); //打開視頻,以上兩句等價于VideoCapture cap("E://2.avi");
13
14 if(!cap.isOpened())//如果視頻不能正常打開則返回
15 return -1;
16
17 int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);//幀寬度
18 int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);//幀高度
19 int frameRate = cap.get(CV_CAP_PROP_FPS);//幀率 × frames/s
20 int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT);//總幀數
21
22 //獲取視頻的相關參數
23 cout << "視頻的寬度:" << width << endl;
24 cout << "視頻的高度:" << height << endl;
25 cout << "視頻的總幀數:" << totalFrames << endl;
26 cout << "幀率:" << frameRate << endl;
27
28 Mat frame;
29 while(1)
30 {
31 cap>>frame;//等價于cap.read(frame);
32 if(frame.empty())//如果某幀為空則退出循環
33 break;
34 imshow("video", frame);
35 waitKey(20);//每幀延時20毫秒
36 }
37 cap.release();//釋放資源
38
39 return 0;
40 }
三、讀取攝像頭
讀取攝像頭和讀取視頻大同小異,主要是這句代碼有些許不同。
1 VideoCapture cap; 2 cap.open(0);
讀取視頻時可以傳入視頻路徑,而讀取攝像頭傳入的是index索引號。
注:
1)如果默認筆記本/臺式機只有一個USB攝像頭,Index=0; 如果有2個,一般Index為0和1,根據具體情況區分,攝像頭接入和斷開會改變Index值
2)如果接入2個以上,但只想用指定的一個,可以在設備管理器中禁用其他,同時Index設置為0
3)因為開啟攝像頭后一直在進行讀取,所以需要用waitKey()返回值判斷退出預覽
1 imshow(“video”, frame); 2 if(waitKey(30)>0)//無按鍵按下返回-1,按鍵按下時退出 3 break;
也可以指定按鍵退出:
1 if(waitKey(30)==27) //Esc鍵退出,ESC的ASCLL碼為27 2 break;
【示例】
1 //讀取攝像頭
2 #include <opencv2/core/core.hpp>
3 #include <opencv2/highgui/highgui.hpp>
4 #include <opencv2/imgproc/imgproc.hpp>
5 #include <iostream>
6
7 using namespace std;
8 using namespace cv;
9
10 int main(){
11 VideoCapture cap;
12 cap.open(0); //打開攝像頭
13
14 if(!cap.isOpened())
15 return -1;
16
17 Mat frame;
18 while(1)
19 {
20 cap>>frame;//等價于cap.read(frame);
21 //Canny(frame, frame, 30, 100);//canny邊緣檢測,去掉這一行就是純粹的讀取攝像頭了
22 cvtColor(frame, frame, CV_BGR2HSV);//BGR空間轉為HSV顏色空間,注意,兩者不能同時對同一張圖片(在此為frame)進行處理,否則報錯
23 if(frame.empty())
24 break;
25 imshow("video", frame);
26 if(waitKey(20)>0)//按下任意鍵退出攝像頭 因電腦環境而異,有的電腦可能會出現一閃而過的情況
27 break;
28 }
29 cap.release();//釋放所有資源
30 destroyAllWindows();//關閉所有窗口
31
32 return 0;
33 }
四、寫入視頻
1、介紹
(1)VideoWriter:OpenCV提供VideoWriter類寫視頻文件,類的構造函數可以指定文件名、播放幀率、幀尺寸、是否創建彩色視頻。
1 CV_WRAP VideoWrite(); 2 CV_WRAP VideoWrite(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);
(2)兩種寫入幀方法:
1 writer.write(frame); 2 writer << frame;
(3)注意事項:
1)寫入視頻前需安裝對應的編解碼器
2)生成視頻是否支持彩色應與構造函數設置一致
3)生成視頻尺寸需與讀取視頻尺寸一致
【示例】
1 //寫入視頻
2 #include <opencv2/core/core.hpp>
3 #include <opencv2/highgui/highgui.hpp>
4 #include <opencv2/imgproc/imgproc.hpp>
5 #include<iostream>
6
7 using namespace cv;
8 using namespace std;
9
10 int main(){
11 VideoCapture cap;
12 cap.open("../../1.avi");
13 Size size0=Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
14 VideoWriter writer("../../out.avi",-1,cap.get(CV_CAP_PROP_FPS),size0,false);
15
16 if(!cap.isOpened())
17 return -1;
18
19 Mat frame;
20 while(1)
21 {
22 cap>>frame;
23 Canny(frame,frame,30,100);
24 if(frame.empty())
25 break;
26 writer<<frame;//等同于writer.write(frame);
27 imshow("video", frame);
28 if(waitKey(10)>0)
29 break;
30 }
31 cout<<"write end!";
32 cap.release();
33 //destroyAllWindows();
34
35 return 0;
36 }
總結
以上是生活随笔為你收集整理的4、【opencv入门】读取视频、读取摄像头的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言计算a+aa+aaa_物业服务企业
- 下一篇: 使用post访问不到接口_Postman