#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>
using namespace std;
int g_slider_position = 0;//定义一个全局变量g_slider_position来存储滑动条的位置
int g_run = 1;//g_run在新的跳转触发后置0,当它为正的时候 指示停止之前要播放多少张图片 为负的时候表示 表示系统处于连续播放视频状态
int g_dontset = 0; //滑动条会随着视频的播放而前进 但是不希望由此而引单步模式 所以引入这个全局变量
cv::VideoCapture g_cap;
//定义一个用户调用滑动条的时候执行的回调函数
void onTrackbarSlide( int pos, void *) {
//使用这个函数将进度条移动到pos位置
g_cap.set( CV_CAP_PROP_POS_FRAMES, pos );
//判断是否进入单步模式 只有用户触发滑动条事件后 这个才会执行
if( !g_dontset ) g_run = 1;
g_dontset = 0;
}
int main( int argc, char** argv ) {
//在屏幕上打开一个窗口 命名为"Example 2-4"
cv::namedWindow( "Example 2-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;
//创建一个滑动条 Positon指明在哪一个窗口放置我们的滑动条
cv::createTrackbar(
"Position",
"Example 2-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", "Example 2-4", current_pos);
cv::imshow( "Example 2-4", frame );
g_run-=1;//作用是保持单步模式或者依据用户设置让视频正常播放
}
char c = (char) cv::waitKey(10);
//等待用户的键盘输入
if( c == 's' ) { // 按下s 进入单步模式
g_run = 1;//使得程序只读取一张图片
cout << "Single step, run = " << g_run << endl;
}
if( c == 'r' ) { // 按下r 将会进入连续视频模式
g_run = -1;
cout << "Run mode, run = " << g_run <<endl;
}
if( c == 27 ) break;//按下esc 程序终止
}
return(0);
}
这是CMakeLists.txt 文件
#这是对CMake工具最低版本要求,这里我们要检查下我们的CMake工具的版本信息,我们可以使用命令“cmake --version”查看
cmake_minimum_required(VERSION 2.6)
project(test)#这是建立一个工程项目,括号里面时工程名,工程名我们可以任意给,最后程序编译出来的可执行文件就是这个名字
FIND_PACKAGE(OpenCV REQUIRED )#用Cmake查找opencv包
set(CMAKE_CXX_STANDARD 11)#用C++11标准库编译
aux_source_directory(. DIR_SRCS)
add_executable(test ${DIR_SRCS})#这里括号里面的两个参数分别是工程项目名和我们要编译文件名的意思,记住中间一空格键隔开
TARGET_LINK_LIBRARIES(test ${OpenCV_LIBS})#这是我们链接到OpenCV库的环节,我们只要更改前面第一个参数位我们的工程项目名即可
下面是运行的结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)