学习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);
}

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