日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

4、【opencv入门】读取视频、读取摄像头

發布時間:2023/12/13 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 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入门】读取视频、读取摄像头的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。