學習OpenCV(一)顯示圖片與播放視頻

利用Qt作爲IDE,Qt+OpenCV環境配置在之前的博客中

Qt+OpenCV環境配置

本系列的目的是詳解demo代碼,快速學習OpenCV相關操作

顯示圖片

#include <opencv2/opencv.hpp> 


int main( int argc, char** argv ) {
    //imread()函數根據文件名確定要加載的文件格式,自動分配圖像數據結構所需的內存
    cv::Mat img = cv::imread(argv[1],-1);
    if( img.empty() ) return -1;
    //namedWindow()在屏幕創建一個窗口,將顯示圖片包含於該窗口
    //窗口標題爲Example1,第二個參數爲窗口屬性,窗口根據圖像大小進行調整
    cv::namedWindow( "Example1", cv::WINDOW_AUTOSIZE );
    //在創建好的窗口中,顯示img圖像
    cv::imshow( "Example1", img );
    //使程序暫停,0或負數表示等待用戶案件操作
    cv::waitKey( 0 );
    //銷燬顯示文件的窗口,同時釋放內存
    cv::destroyWindow( "Example1" );
    return 0;
}


播放視頻

//從磁盤播放視頻文件

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

int main( int argc, char** argv ) {
	
	//創建一個窗口,命名爲Example3
 	cv::namedWindow( "Example3", cv::WINDOW_AUTOSIZE );
 	//實例化一個對象cap
 	cv::VideoCapture cap;
 	//open()通過參數確定要讀入的視頻文件
 	cap.open( string(argv[1]) );
 	//實例化一個對象frame保存視頻幀
 	cv::Mat frame;
 	
 	//無限循環,與while(1)具有相同效果,在以前的編譯器優化中for效率更高
 	for(;;) {
  		//逐幀讀取
  		cap >> frame;
  		//幀中沒有圖像退出循環
  		if( frame.empty() ) break;
  		//顯示讀取的幀 
  		cv::imshow( "Example3", frame );
  		//當前幀被顯示,等待33ms
  		//這裏設置33ms是簡單假設每秒30幀,可以等待任意時間長度
  		//如果用戶觸發按鍵(ASCII碼>=0),則退出循環,否則33ms後繼續執行循環
  		if( cv::waitKey(33) >= 0 ) break; 
  		}
 	return 0;
}

播放控制–增加滾動條

//播放控制--增加滾動條
//爲了增加程序可讀性,在全局變量前面加g_
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>

using namespace std;

//定義全局變量g_slider_positio,保持滑塊位置
int g_slider_position = 0;
//g_run數字不爲0時,顯示新幀
int g_run = 1;
//保證在不觸發單步模式是更新滑塊的位置
int g_dontset = 0;  // start out in single-step mode
//捕獲對象,用於回調
cv::VideoCapture g_cap;

//參數pos爲新的滑塊位置
void onTrackbarSlide( int pos, void *) {
	//set()函數可以配置cv::VideoCapture對象的屬性,與之對應的是get()函數
	//利用set()函數將視頻推進到新的位置
	//CAP_PROP_POS_FRAMES這個參數表示以幀數設置讀入位置
	g_cap.set( cv::CAP_PROP_POS_FRAMES, pos );
	//在進入下一個新幀的時候進入單步模式
	if( !g_dontset )
		g_run = 1;
	g_dontset = 0;
}

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
	//frames爲滑動條的最大值
	//當滑動條被滑動時候的回調函數onTrackbarSlide
	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);
		//按下s進入單步模式
		if( c == 's' ) // single step
			{g_run = 1; cout << "Single step, run = " << g_run << endl;}
		//按下r進入連續模式
		if( c == 'r' ) // run mode
			{g_run = -1; cout << "Run mode, run = " << g_run <<endl;}
		//按下esc退出
		if( c == 27 )
			break;
	}
	return(0);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章