计算机视觉opencv

编写一个有滑动条的播放器

不知道玩编程的同学们有没有尝试过用代码编写出好玩的东西呢?今天机协的视觉小哥哥就来给大家分享一个酷炫实例

用opencv编写一个视频播放器!!!

预备知识

*本例需要读者自行安装好opencv库。并且在VS2017中配置好opencv的环境。

本文中用到的opencv方面的名词:

VideoCapture:一个能包含我们从摄像机或者视频文件读取每

一帧图像所必须的信息的对象

CAP_PROP_POS_FRAMES:从零开始下一帧的索引

WINDOW_AUTOSIZE:能将窗口自动变换到合适的大小

CAP_PROP_FRAME_COUNT:视频文件中的帧总数

一只potplayer 截图

createTrackbar():能建立一个滑动条并指明标签、放置的窗口、

与滑动条绑定的变量、滑动 条能达到的最大值和一个调用的函数

waitKey():能不断刷新图像,参数是频率,单位是ms

namedWindow():用于建立一个窗口并对窗口进行命名

这些形形色色的API会不会看的有些懵了呢?

没关系,下面代入程序主体去理解可能会好些

代码详解

程序所需包含的头文件:

定义全局变量g_slider_position(滑动条的位置)、g_run(视频播放状态)、g_dontest(用于回调函数中将视频在滑动条移动时暂停,详情可见下文)

回调函数(在滑动条移动后将视频进度与滑动条同步)

主函数部分

首先建立一个窗口,命名为RM,窗口大小自动

namedWindow的作用是建立一个一个窗口。又两个参数。分别为窗口的名字和一个标志值。其中WINDOW_NORMAL为用户可以改变窗口的大小。

而WINDOW_AUTOSIZE则窗口大小会自动调整以适应所显示的图像,但不能手动改变窗口大小。

在先前声明的 g_cap 这个 VideoCapture 对象中打开所要播放的文件(以string的格式打开)

注意由于C++中字符'\'为转义字符。所以我们需要'\\'来表示文件路径中的'\'

调用函数g_cap.get()获取g_cap的总帧数

接下来就到了关键的一步——建立一个滑动条

声明一个Mat型变量frame

利用循环播放视频文件:这里g_run作为一个表示播放模式的变量,值为1时进行单步模式,值为-1时进行连续播放模式(这里是由于条件判断语句中有一个g_run != 0以及末尾的g_run -= 1使得当g_run = 1时能立刻挑出条件语句而等于-1时则会不停地执行下去)。将g_cap打开的视频文件导入到frame中,将滑动条的位置置为视频文件播放到的进度(期间利用变量current_pos作为传递),同时以帧为单位播放视频文件。

按键部分:这里将s、r、esc、a、d设为单步模式、连续视频、退出、后退、前进的快捷键(这里要注意的是改变和调用类似于CAP_PROP_POS_FRAMES的变量必须要调用Videocapture的set()/get()函数)

最终成果

效果如下:

代码汇总

#include <iostream>

#include <opencv2/opencv.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <fstream>

using namespace std;

int g_slider_position = 0;

int g_run = 1;

bool g_dontest = 0;

cv::VideoCapture g_cap;

void onTrackbarSlide(int pos, void *) {

g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);

if (!g_dontest) { g_run = 1; g_dontest = false; }

int main() {

cv::namedWindow("RM", cv::WINDOW_AUTOSIZE);//窗口名称为RM,模式为WINDOW_AUTOSIZE

g_cap.open(string("C:\\Users\\mkzrong\\Desktop\\1.mkv"));//文件目录

int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);//取得视频总帧数

cv::createTrackbar("Position", "RM", &g_slider_position, frames, onTrackbarSlide);

军情解码》最近

cv::Mat frame;

while (true) {

一部、配想象potplayer官网

if (g_run != 0) {

g_cap >> frame;//读入帧

if (!frame.data)break;//没有图像退出播放

int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);

g_dontest = true;

cv::setTrackbarPos("Position", "RM", current_pos);

cv::imshow("RM", frame);

g_run -= 1;

char c = (char)cv::waitKey(100);

if (c == 's') { g_run = 1; }

if (c == 'r') { g_run = -1; }

if (c == 27) { break; }

if (c == 'a') {

g_cap.set(cv::CAP_PROP_POS_FRAMES, g_cap.get(cv::CAP_PROP_POS_FRAMES) - frames * 0.01);

if (!g_dontest) { g_run = 1; g_dontest = false; }

if (c == 'd') {

g_cap.set(cv::CAP_PROP_POS_FRAMES, g_cap.get(cv::CAP_PROP_POS_FRAMES) + frames * 0.01);

if (!g_dontest) { g_run = 1; g_dontest = false; }

return (0);

至此,在C++语言中利用opencv库编写带滑动条的播放器的程序已经完成了,这里只是利用了opencv库一些基本的功能,更多的偏向于视觉方面的功能如视频图像的变换处理等功能等待读者的挖掘!

如果有疑问,大家可以留言。有帅气可爱的小哥哥在线答疑哦。