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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV捕获视频和摄像头

發(fā)布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV捕获视频和摄像头 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

從文件中捕獲視頻

其實(shí)使用OpenCV讀取視頻相當(dāng)簡單,只需要初始化一個VideoCapture對象,打開視頻文件,逐幀讀取。

程序

下面是簡單的OpenCV代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <opencv2\highgui\highgui.hpp> #include <iostream> ? usingnamespace cv; usingnamespace std; ? intmain(intargc,?char**argv) { ????//打開視頻文件 ????VideoCapture cap("Girls'Generation.avi"); ????if(!cap.isOpened()) ????{ ????????cout <<?"不能打開視頻文件"<< endl; ????????return-1; ????} ????//從3000ms開始播放視頻 ????//cap.set(CV_CAP_PROP_POS_MSEC, 3000); ? ????//獲取視頻的幀速率 ????doublefps = cap.get(CV_CAP_PROP_FPS); ????cout <<?"幀/秒:"<< fps << endl; ? ????namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); ????while(true) ????{ ????????Mat frame; ????????//從視頻中讀取一個幀 ????????boolbSuccess = cap.read(frame); ????????if(!bSuccess) ????????{ ????????????cout <<"不能從視頻文件讀取幀"<< endl; ????????????break; ????????} ????????//在MyVideo窗口上顯示當(dāng)前幀 ????????imshow("MyVideo", frame); ????????//如果30ms沒有按下鍵,就返回-1,當(dāng)按下ESC鍵返回27 ????????if(waitKey(30)==27) ????????{ ????????????cout <<?"按下ESC鍵"<< endl; ????????????break; ????????} ????} ? ????return0; }

解釋

1 VideoCapture::VideoCapture(conststring& filename)

這是VideoCapture類為數(shù)不多的構(gòu)造函數(shù)的一個。這個構(gòu)造函數(shù)打開視頻文件并為讀取視頻流初始化VideoCapture對象。
這個類的析構(gòu)函數(shù)會釋放對象關(guān)聯(lián)的所有內(nèi)存。因此,不需要在程序中顯示的釋放內(nèi)存。

1 boolVideoCapture::IsOpened()

如果調(diào)用VideoCapture構(gòu)造函數(shù)成功,這個方法返回true,否則返回false。
檢查VideoCapture初始化是否成功是有必要的。如果失敗,程序應(yīng)該退出,否則當(dāng)從VideoObject中讀取幀的時候,程序就會崩潰了。

1 boolVideoCapture::set(intpropId,?doublevalue)

這個方法改變VideoObject對象的屬性,如果成功,返回true,否則返回false。你應(yīng)該在你的代碼中嘗試修改視頻流的一些屬性。在我的代碼中,我改變了CV_CAP_PROP_POS_MSEC屬性。

它的參數(shù):

  • int propID –?這個參數(shù)指定你要更改的屬性。這個參數(shù)有很多可選項,這里列出一部分。
    • CV_CAP_PROP_POS_MSEC – 視頻的當(dāng)前位置(毫秒)
    • CV_CAP_PROP_POS_FRAMES –?視頻的當(dāng)前位置(幀)
    • CV_CAP_PROP_FRAME_WIDTH – 視頻流的寬度
    • CV_CAP_PROP_FRAME_HEIGHT – 視頻流的高度
    • CV_CAP_PROP_FPS – 幀速率(幀/秒)
    • CV_CAP_PROP_FOURCC?– 編碼器的四字符編碼
  • double value – 給propID分配的值。
1 doubleVideoCapture::get(intpropId)

這個函數(shù)返回指定的propId的屬性值。它的可選項和set函數(shù)的propID一樣。

1 boolVideoCapture::read(Mat& image);

這個函數(shù)抓取視頻的下一幀,解碼并存儲在‘image’變量中。在這個函數(shù)內(nèi)部會調(diào)用VideoCapture::grap()和VideoCapture::retrieve()??梢允褂眠@2個函數(shù)代替VideoCapture::read()函數(shù)。如果操作成功,返回true,否則返回false。

1 waitKey(30)

這個函數(shù)等待30毫秒。如果在指定的時間按下鍵,它會返回鍵的ASCII值。如果這個值是27,程序就會執(zhí)行if塊。如果在30毫秒內(nèi)沒有按下鍵,程序返回-1,程序繼續(xù)while循環(huán)。

1 VideoCapture::~VideoCapture()

VideoCapture對象的析構(gòu)函數(shù)會釋放對象所有關(guān)聯(lián)的內(nèi)存。在程序退出main方法時,析構(gòu)函數(shù)會隱式調(diào)用。

總結(jié)

首先,這個程序從文件中捕獲一個視頻,然后進(jìn)入一個無限循環(huán)。在這個循環(huán)中,它從捕獲的視頻中連續(xù)地抓取幀,解碼,然后顯示在窗口中并等待30毫秒。如果視頻沒有更多的幀或按下了ESC鍵,程序就會跳出無限循環(huán)。

注意:使用waitKey(int)函數(shù)非常重要,因?yàn)閕mshow(string&, MAT)函數(shù)需要時間在窗口上繪制圖像,正是waitKey(int)提供了這個時間。

從攝像頭中采集視頻

程序

下面的程序和上面的最大不同是VideoCapture構(gòu)造函數(shù)的參數(shù)。這里我給VideoCapture的構(gòu)造函數(shù)提供攝像頭的編號來代替一個文件名。下面是OpenCV代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #include <opencv2\highgui\highgui.hpp> #include <iostream> ? usingnamespace cv; usingnamespace std; ? intmain(intargc,?char**argv) { ????// 打開第1個攝像頭 ????VideoCapture cap(0); ? ????if(!cap.isOpened()) ????{ ????????cout <<?"不能打開攝像頭!"<< endl; ????????return-1; ????} ? ????//獲取視頻幀的寬度 ????doubledWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); ????//獲取視頻幀的高度 ????doubledHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); ? ????cout <<?"視頻幀尺寸 : "<< dWidth <<?" x "<< dHeight << endl; ? ????namedWindow("MyVideo", CV_WINDOW_AUTOSIZE); ? ????while(1) ????{ ????????Mat frame; ? ????????boolbSuccess = cap.read(frame); ? ????????if(!bSuccess) ????????{ ????????????cout <<?"不能從視頻流中讀取幀!"<< endl; ????????????break; ????????} ? ????????imshow("MyVideo", frame); ? ????????if(waitKey(30) == 27) ????????{ ????????????cout <<?"ESC鍵被按下"<< endl; ????????????break; ????????} ????} ????return0; ? }

解釋

1 VideoCapture::VideoCapture(intdevice)

這是VideoCapture 3個構(gòu)造函數(shù)的一個。這個構(gòu)造函數(shù)打開給定編號的攝像頭并為讀取攝像頭的視頻流初始化VideoCapture對象。這里的“0”表示使用編號為0的攝像頭。如果你的電腦上有多個攝像頭,可以使用1,2,3…代替0。

1 doubledWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH)

這個函數(shù)獲取攝像頭輸出幀的寬(像素)

1 doubledHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT)

這個函數(shù)獲取攝像頭輸出幀的高(像素)

其他所有的函數(shù)都跟第一個程序中一樣。

總結(jié)

以上是生活随笔為你收集整理的OpenCV捕获视频和摄像头的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品天天干 | 欧美日韩一区二区三 | 国产免费黄色大片 | 91福利社在线观看 | 亚洲在线精品 | 国产性生活一级片 | 香蕉视频黄污 | 日韩成人性视频 | 91天天 | 欧美日韩国产黄色 | 91网站视频在线观看 | 黑人操日本女优 | 五月婷婷社区 | 香蕉av一区二区三区 | 顶级嫩模啪啪呻吟不断好爽 | 国产美女在线观看 | 射黄视频| 国产精品精东影业 | 成人乱人乱一区二区三区一级视频 | 中文字幕电影一区二区 | wwwwww色| 国产伦精品一区二区三区高清版 | 天天舔天天插 | 欧美精品一区二区三区三州 | 国产人人干 | 日韩高清一区二区 | 国语对白av | 91精品入口| 婷婷五月色综合 | 国产成a人亚洲精v品在线观看 | 日本少妇毛茸茸高潮 | 国产成人精品一区二区三区网站观看 | 夜夜天天干 | 无码人妻丰满熟妇区bbbbxxxx | 草草久久久无码国产专区 | 麻豆专区| 亚洲色图在线播放 | 一色道久久88加勒比一 | 久久艹这里只有精品 | 欢乐谷在线观看免费播放高清 | a黄视频| 红桃视频91 | 先锋av资源 | 欧美极品少妇xxxxⅹ猛交 | 福利社区一区二区 | 午夜电影天堂 | 在线观看免费视频一区 | 三级全黄做爰龚玥菲在线 | 久99久视频 | 中文字幕码精品视频网站 | 久久6精品 | 91精品国产91久久久久久黑人 | 亚洲区小说区图片区 | 一本色道久久综合无码人妻 | 久久精品视频国产 | 国产精品后入内射日本在线观看 | 免费看片91 | 亚洲色欧美| 激情视频亚洲 | 精品在线播放视频 | 黄瓜视频在线观看 | 国产毛片视频网站 | 日韩在线国产 | 亚洲国产欧美一区二区三区深喉 | 欧美精品videos极品 | 国产黄色免费在线观看 | 婷婷丁香花五月天 | 999热精品视频 | 95视频在线 | 吊视频一区二区三区 | 中文无码av一区二区三区 | 91在线导航 | 羞羞在线观看 | 欧美经典一区二区 | 日本免费一区二区三区 | 久久午夜无码鲁丝片 | 激情六月天婷婷 | 干爹你真棒插曲免费 | 亚洲av无码久久忘忧草 | av网站免费在线 | 日本黄页网站免费大全 | 91在线不卡 | 狠狠干男人的天堂 | 国产天天射 | 国产操比视频 | 亚洲一区二区三区观看 | 国产一区麻豆 | 欧美黄色大片网站 | 狠狠干免费视频 | 欧美精品国产一区 | 国产xxxx视频 | av少妇 | 色噜噜日韩精品欧美一区二区 | 尤物在线观看视频 | 日出白浆视频 | 欧美一区永久视频免费观看 | 亚洲男人的天堂av | 欧美日韩中日 | 欧美日韩免费一区 |