學習OpenCV 3(中文版)》 —跳轉(zhuǎn)

      網(wǎng)友投稿 1056 2025-03-31

      跳轉(zhuǎn)

      為了強化前面這個簡單的程序以及發(fā)現(xiàn)更多有用的函數(shù),現(xiàn)在是時候反思一下了。我們也許已經(jīng)注意到示例2-3中的視頻播放器不可以快速在視頻中進行跳轉(zhuǎn)。所以我們下一個

      注4: 你也許想要定義其他時間長度,在這個情況下,我們簡單說明33毫秒是因為這能讓視頻以30FPS的速率播放,并且能夠允許用戶在播放的時候打斷。根據(jù)以往的經(jīng)驗,最好檢查 cv::VideoCapture結(jié)構(gòu)來確定視頻真正的幀率(更多詳情請參閱第8章)。任務就是添加一個滑動條,使得用戶可以進行視頻跳轉(zhuǎn)。為了執(zhí)行更多的控制,我們將會允許用戶通過按下S鍵來執(zhí)行單步模式,以及按下R鍵來恢復連續(xù)視頻播放模式,無論何時用戶通過滑動條跳轉(zhuǎn)到視頻一個新的時間點,我們都會使用單步模式在那個點進行播放。

      HighGUI工具提供了許多簡單的工具用于處理視頻和圖像,而不僅僅是我們剛才演示的那些功能。一個特別有用的工具就是我們前面所提到的滑動條,它能夠使用戶輕松從視頻的一個部分跳轉(zhuǎn)到另一個部分。要創(chuàng)建一個滑動條,我們會調(diào)用cv::createTrackbar() 并指明要在哪個窗口中進行顯示,為了完成所需要的功能,我們還需要一個能夠執(zhí)行重新定位的回調(diào)函數(shù),示例2-4給出了代碼表述。

      示例2-4:加入了滑動條的基本瀏覽窗口

      #include "opencv2/highgui/highgui.hpp"

      #include "opencv2/imgproc/imgproc.hpp" #include #include using namespace std;

      int g_slider_position = 0;

      int g_run = 1, g_dontset = 0; //start out in single step mode cv::VideoCapture g_cap; void onTrackbarSlide( int pos, void *) {?? g_cap.set( cv::CAP_PROP_POS_FRAMES, pos );

      if( !g_dontset )???? g_run = 1;?? g_dontset = 0;

      《學習OpenCV 3(中文版)》 —跳轉(zhuǎn)

      } int main( int argc, char** argv ) {

      cv::namedWindow( "Example2_4", cv::WINDOW_AUTOSIZE );?? g_cap.open( string(argv[1]) );

      int frames = (int) g_cap.get(cv::CAP_PROP_FRAME_COUNT);?? int tmpw?? = (int) g_cap.get(cv::CAP_PROP_FRAME_WIDTH);?? int tmph?? = (int) g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);?? cout << "Video has " << frames << " frames of dimensions("

      << tmpw << ", " << tmph << ")." << endl;

      cv::createTrackbar("Position", "Example2_4", &g_slider_position, frames,????????????????? onTrackbarSlide);

      cv::Mat frame;?? for(;;) {???? if( g_run != 0 ) {

      g_cap >> frame; if(frame.empty()) break;

      int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);?????? g_dontset = 1;

      cv::setTrackbarPos("Position", "Example2_4", current_pos);?????? cv::imshow( "Example2_4", frame );?????? g_run-=1;???? }

      char c = (char) cv::waitKey(10);???? if( c == 's' ) // single step

      {g_run = 1; cout << "Single step, run = " << g_run << endl;}???? if( c == 'r' ) // run mode

      {g_run = -1; cout << "Run mode, run = " << g_run <

      }?? return(0);

      }

      本質(zhì)上,代碼中添加一個全局變量來表示滑動條的位置并且添加一個回調(diào)函數(shù)來更改這個變量來重新定位視頻讀取的位置。在創(chuàng)建滑動條和回調(diào)函數(shù)之后,我們就開始運行程序,注5讓我們從全局變量開始更詳細地查看整個程序。

      int g_slider_position = 0; int g_run???????????? = 1;

      int g_dontset???????? = 0;????? // start out in single-step mode VideoCapture g_cap;

      在程序的開始處,我們定義了一個全局變量g_slider_position來存儲滑動條位置。由于回調(diào)函數(shù)需要訪問幀讀取結(jié)構(gòu)g_cap,所以我們最好將這個結(jié)構(gòu)也提升為全局變量。為了保證代碼的易讀性。我們會在每一個全局變量前加上g_前綴以表明這是一個全局變量。同理,全局變量g_run將在新的跳轉(zhuǎn)觸發(fā)之后置0。當它為正的時候,指示在停止之前程序要播放多少張圖片;當它為負的時候,表示系統(tǒng)處于連續(xù)視頻播放模式。

      為了防止沖突,在用戶單擊了滑動條跳轉(zhuǎn)到一個視頻的新位置之后,我們將會通過設置 g_run變量為1使視頻進入單步模式。即使是這樣,也存在一個小問題:當視頻前進的時候,我們希望滑動條也能夠隨著視頻的當前進度前進。我們通過在程序中調(diào)用滑動條的回調(diào)函數(shù)實現(xiàn)這一功能。但是,我們并不希望在這個時候進入單步模式。為了避免這樣的事情發(fā)生,我們引入最后一個全局變量g_dontset來避免在調(diào)整進度條位置的時候觸發(fā)單步模式。

      注5: 注意,有一些AVI格式和MPEG格式的文件不允許在視頻中向后跳轉(zhuǎn)。

      void onTrackbarSlide(int pos, void *) {?? g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);

      if( !g_dontset )???? g_run = 1;?? g_dontset = 0;

      }

      現(xiàn)在,定義一個用戶調(diào)整滑動條的時候執(zhí)行的回調(diào)程序。這個程序?qū)魅胍粋€32位的整型數(shù)值以表示當前的位置。這將會是進度條存在的新的位置。在回調(diào)函數(shù)的內(nèi)部,我們在新的位置通過調(diào)用g_cap.set()來真正使進度條移到我們希望的位置。if()語句設置程序是否進入單步模式。只有在用戶觸發(fā)滑動條事件的時候,這個設置才會生效;在系統(tǒng)自動調(diào)用該回調(diào)函數(shù)的時候,單步模式不會生效。

      調(diào)用g_cap.set()是我們以后經(jīng)常使用的一個操作,它通常配合g_mcap.get()使用。這些程序允許我們配置(或是詢問,這將在稍后介紹)cv::VideoCapture結(jié)構(gòu)中的許多變量。在本例中,我們輸入?yún)?shù)CV::CAP_PROP_POS_FRAMES,這個參數(shù)指示我們想要幀集合的讀取位置。注6

      int frames = (int) g_cap.get(cv::CAP_PROP_FRAME_COUNT); int tmpw?? = (int) g_cap.get(cv::CAP_PROP_FRAME_WIDTH); int tmph?? = (int) g_cap.get(cv::CAP_PROP_FRAME_HEIGHT); cout << "Video has " << frames << " frames of dimensions("????? << tmpw << ", " << tmph?? << ")." << endl;

      主程序的核心和示例2-3一致,所以我們將把重點放在我們添加了什么上面。第一個不同是在打開視頻之后我們用g_cap.get()來確定總幀數(shù)以及視頻的高和寬。這些數(shù)字打印出來之后,我們需要這些視頻中和幀有關的信息來校準滑動條(在下一步)。

      createTrackbar("Position", "Example2_4", &g_slider_position, frames,??????????????? onTrackbarSlide);

      下一步我們將創(chuàng)建一個滑動條,這個函數(shù)cv::createTrackbar()允許我們給滑動條一個標簽注7(在本例中,是Position)并且指明在哪一個窗口放置我們的滑動條。我們提供一個和滑動條綁定的變量——滑動條能夠達到的最大值(視頻的總幀數(shù))以及一個在滑動條移動時候的回調(diào)函數(shù)(不需要的時候也可以輸入NULL)。

      if( g_run != 0 ) {

      注6: 因為HighGUI的代碼是高度自動化的,所以當一個新的視頻位置被請求的時候,將自動處理一些(諸如請求的幀并非是一個關鍵幀等)問題。如果遇到這種情況,它會從請求位置之前的一個關鍵幀開始播放并且快進到請求的位置,免得我們考慮這些繁瑣的問題。

      g_cap >> frame; if(!frame.data) break;?? int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);?? g_dontset = 1;

      cv::setTrackbarPos("Position", "Example2_4", current_pos);?? cv::imshow( "Example2_4", frame );?? g_run-=1;

      }

      在while循環(huán)中,為了讀取和顯示視頻中的幀,我們還會獲取在視頻中的當前位置,設置g_dontset使下一個滑動條的回調(diào)函數(shù)不會讓我們進入單步模式,之后我們將會委托滑動條的回調(diào)函數(shù)來更新滑動塊在滑動條上的位置以便顯示給用戶。全局變量g_run將會減1,它的效果是讓我們保持單步模式或者依據(jù)用戶的設置讓視頻正常播放。接下來我們將會看到以下結(jié)構(gòu):

      char c = (char) cv::waitKey(10); if( c == 's' ) // single step

      {g_run = 1; cout << "Single step, run = " << g_run << endl;} if( c == 'r' ) // run mode

      {g_run = -1; cout << "Run mode, run = " << g_run <

      在while循環(huán)的底部,我們會等待用戶的鍵盤輸入。如果S鍵被按下,我們將會進入單步模式(g_run將會被設置為1,會使得程序只讀取一張圖片)。如果R被按下,我們將會進入連續(xù)視頻模式(g_run將會被設置為-1,之后進一步遞減使其對于之后任意幀都為負)。最后,如果Esc被按下,程序?qū)K止。再次提醒你注意,為了讓代碼更簡潔,我們略過了回收窗口垃圾這一步cv::destroyWindow()。

      OpenCV 視頻

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:供應鏈管理與ERP軟件之間的主要區(qū)別
      下一篇:怎么在篩選項下加入項目名稱(在篩選里添加名稱怎么添加)
      相關文章
      精品国产亚洲男女在线线电影 | 久久精品国产亚洲AV果冻传媒| 国产精品久久久久久亚洲影视 | 7777久久亚洲中文字幕| 亚洲色图国产精品| 亚洲免费在线视频| 亚洲视频免费观看| 亚洲精品无码久久毛片波多野吉衣| 亚洲卡一卡2卡三卡4卡无卡三 | 2022年亚洲午夜一区二区福利| 香蕉视频在线观看亚洲| 亚洲AV人无码激艳猛片| 亚洲天堂中文资源| 亚洲视频一区在线| 亚洲宅男天堂a在线| 亚洲AV无码乱码麻豆精品国产| 亚洲一级毛片中文字幕| 亚洲色精品VR一区区三区| 亚洲午夜无码久久| 亚洲a∨国产av综合av下载| 国产精品亚洲专一区二区三区| 亚洲福利视频一区二区| 久久精品国产亚洲AV不卡| 亚洲人成色7777在线观看| 亚洲va无码专区国产乱码| 午夜亚洲www湿好大| 亚洲毛片免费视频| 亚洲最大av资源站无码av网址| 亚洲高清乱码午夜电影网| 亚洲国产精品无码久久青草| 亚洲一区二区三区在线观看精品中文 | 91午夜精品亚洲一区二区三区| 亚洲国产亚洲片在线观看播放 | 亚洲欧美成aⅴ人在线观看| 豆国产96在线|亚洲| 中文字幕久久亚洲一区| 亚洲av无码不卡一区二区三区| 亚洲美女免费视频| 亚洲无码一区二区三区| 亚洲黄片毛片在线观看| 国产亚洲一区二区在线观看|