利用Qt作爲IDE,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);
}