从今天开始记录下学习openCV3+vs2017的过程吧,记录一些学习代码(大部分是书上的)和自己的理解,方便回顾。参考教材《学习OpenCV3》----Adrian Kaehler,Gary Bradski
(为了生活,hh)
示例2—4 加入滑动条的视频播放,按S键单步运行,R键连续播放。(P25)
#include"pch.h" //预编译头,如果不想写这个可以右键你的工程-属性-C/C++ -预编译头--不使用
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<iostream>
#include<fstream>
using namespace std;
//设置全局变量
int g_slider_position = 0; //设置初始位置为0
int g_run = 1; //是否单步运行,1为单步
int g_dontset = 0; //避免在滑动条同步画面回调程序时单步运行(详见下面的回调程序)
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;
}
//主函数
int main() {
cv::namedWindow("example2_4", cv::WINDOW_AUTOSIZE);//定义名为‘’example2_4‘’的显示窗
g_cap.open("F:/test.avi"); //文件地址
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; //显示字符,例如Video has455frames of dimensions(176,184)
cv::createTrackbar("Position", "example2_4", &g_slider_position, frames, onTrackbarSlide);//创建一个滑动条,格式为createTrackbar(名称,依附于哪个窗口,初始化阈值,刻度范围,回调函数)
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);//根据current_pos回调bar的位置
cv::imshow("example2_4", frame);//显示当前帧
g_run -= 1;//自减1
}
//根据用户的输入设定模式
char c = (char)cv::waitKey(10);
if (c == 's') //单步运行模式
{
g_run = 1;
cout << "Single step,run=" << g_run << endl;
}
if (c == 'r') //运行模式
{
g_run = -1;
cout << "Run mode,run=" << g_run << endl;
}
if (c == 27) //如果按ESC,退出(ESC键的ASCII码就是27)
break;
}
return(0);
}
代码基本思路:从循环(for(;;),也可以用while(1))开始,g_run =1,执行if里面的语句,读入第一帧,获取当前位置并更新进度条的位置,显示,g_run =g_run -1=0,跳出if。根据用户键入值选择运行模式,若选择单步,则g_run =1,再次进入if语句,若选择正常播放,则g_run =-1,进入if,按以上方式放完一帧,g_run =g_run -1=-2,满足if条件,继续执行。若用户输入ESC,则跳出循环。
网友评论