美文网首页
openCV3+VS2017学习笔记(一)

openCV3+VS2017学习笔记(一)

作者: whisper330 | 来源:发表于2018-11-27 23:52 被阅读0次

从今天开始记录下学习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,则跳出循环。

相关文章

网友评论

      本文标题:openCV3+VS2017学习笔记(一)

      本文链接:https://www.haomeiwen.com/subject/wewnqqtx.html