opencv视频播放

简介

  本篇主要是介绍opencv下的视频播放,视频快进、快退和暂停的实现。

视频播放

具体代码

  具体代码如下:
#include<cstring>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
double tmp;
 
int main(int argc, char **argv){
    Mat frame;
    bool stop(false);
 
    VideoCapture capture(argv[1]);
    if (!capture.isOpened()){
        return 0;
    }
 
    while(!stop){
        if (!capture.read(frame)){
            break;
        }
        // show foreground
        imshow("Video", frame);
        if (waitKey(50) == ‘q‘){
            stop = true;
        }
    }
 
    return 0;
}

代码讲解

  1、首先打开视频文件。
    VideoCapture capture(argv[1]);
    if (!capture.isOpened()){
        return 0;
    }
  2、接着使用capture.read(frame)不断读取每帧视频文件数据,放入到frame中,之后imshow显示出当前帧数据,使用waitkey等待50ms,看用户是否
输入键值‘q’,如果有,则直接退出视频播放,若没有,则继续播放下一帧,直到视频文件播放完后程序退出。
 while(!stop){
        if (!capture.read(frame)){
            break;
        }
        // show foreground
        imshow("Video", frame);
        if (waitKey(50) == ‘q‘){
            stop = true;
        }
 }

效果演示

  具体效果如下:
       

简单播放器实现

  在本例中实现了video播放简单的功能,如显示当前播放进度,快进、快退和暂停功能。

具体代码

#include<cstring>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/core/core.hpp>
#include <math.h>
#include <string.h>
#include <opencv/cv.h>
 
 
#define  window_name "video"
#define trackbar_type "progress"
#define trackbar_speed "speed"
 
using namespace std;
using namespace cv;
 
CvCapture *capture;
int max_fps = 0, cur_fps = 0, tmp_fps = 0;
int bar_num = 0, bar_max = 100;
int video_speed = 10, video_maxspeed = 300;
 
void fps_change(int, void* ){
	cur_fps = bar_num * tmp_fps;
	cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, cur_fps);
}
 
void speed_change(int, void* ){
}
 
int main(int argc, char **argv){
	Mat frame;
	bool stop(false);
	VideoCapture capture;
 
	capture.open(argv[1]);
	if (!capture.isOpened()){
		return 0;
	}
 
	while(!stop){
		if (!capture.read(frame)){
			break;
		}
		max_fps += 1;
		if (waitKey(1) == ‘q‘){
			stop = true;
		}
	}
	capture.release();
	stop = false;
	tmp_fps = max_fps / 100;
 
	capture.open(argv[1]);
	if (!capture.isOpened()){
		return 0;
	}
 
	namedWindow(window_name);
	createTrackbar(trackbar_type, window_name, &bar_num, bar_max, fps_change);
	createTrackbar(trackbar_speed, window_name, &video_speed, video_maxspeed, speed_change);
	while(cur_fps <= max_fps){
		if (!capture.read(frame)){
			break;
		}
		cur_fps += 1;
		bar_num = cur_fps / tmp_fps;
		if(cur_fps % tmp_fps == 0){
			cvSetTrackbarPos(trackbar_type, window_name, bar_num);
		}
		imshow(window_name,frame);
		if(cvWaitKey(video_speed) == ‘q‘)
			break;
	}
        <a href="http://www.opengroup.org/onlinepubs/%3Cspan%20class=" nu19"="" style="text-decoration: none; color: rgb(11, 0, 128); background-image: none; background-position: initial initial; background-repeat: initial initial;">009695399/functions/printf.html">printf("max_fps:%d, cur_fps:%d\n", max_fps, cur_fps);
	destroyWindow("video");
 
	return 0;
}

代码讲解

  这部分主要是使用了两个Trackbar来实现,第一个Trackbar用来显示和拖动当前播放进度。第二个Trackbar用来设置视频播放的快进、慢放和暂停。
  1、这里在播放之前需要获得当前视频文件的帧数。
opencv提供了如下函数,可以获得视频文件帧数,但是该函数并不一定准确。
  int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
所以最准确的办法,是将视频文件帧都取出来一遍,然后获得它们的帧总数,不过该方法耗时间很多,影响用户体验。
        while(!stop){
		if (!capture.read(frame)){
			break;
		}
		max_fps += 1;
		if (waitKey(1) == ‘q‘){
			stop = true;
		}
	}
	capture.release();
	stop = false;
  2、计算保存1%的总帧数,然后用这个为基准,计算当前视频播放的百分比,并在第一个Trackbar(progress)中显示出来。同时也可以通过拖动
第一个Trackbar(progress)来进行播放进度控制。
void fps_change(int, void* ){
	cur_fps = bar_num * tmp_fps;
	cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, cur_fps);
}
 
tmp_fps = max_fps / 100;
createTrackbar(trackbar_type, window_name, &bar_num, bar_max, fps_change);
 
cur_fps += 1;
bar_num = cur_fps / tmp_fps;
if(cur_fps % tmp_fps == 0){
	cvSetTrackbarPos(trackbar_type, window_name, bar_num);
}
  3、通过变量video_speed,在第二个Trackbar(speed)用来控制视频播放的速度,当video_speed数值越大,则waitkey等待时间越长,播放速度越慢;
同样的,当video_speed数值越小,则播放速度越快。但是需要注意:如果video_speed为0,则表示waitkey一直等待,则video播放暂停。
int video_speed = 10, video_maxspeed = 300;
 
createTrackbar(trackbar_speed, window_name, &video_speed, video_maxspeed, speed_change);
 
if(cvWaitKey(video_speed) == ‘q‘)
     break;

效果演示

  具体效果如下:
       
时间: 2024-08-25 17:09:26

opencv视频播放的相关文章

OpenCV视频播放方法

今天折腾了一下OpenCV的视频播放功能,希望能对项目又帮助- 代码还是非常easy的,仅仅是之前遇到点小麻烦,找不到cvCreateFileCapture函数的定义,花了一两个小时 Makefile: SOURCE_FILE := play_video.c OBJECT_FILE := play_video.o CFLAGS = -Wall -Wconversion -O3 `pkg-config --cflags opencv` LIBS = `pkg-config --libs --cfl

OpenCV源码解析

OpenCV K-means源码解析 OpenCV 图片读取源码解析 OpenCV 视频播放源码解析 读懂OpenCV源码需要哪些基础? 通读过C++ Primer,目前C++属于入门级, 数字图像处理基础也有.目前看不懂OpenCV源码,请问还需要哪些基础, 从哪些方面入手源码比较好呢?谢谢 回答: 半年前实习的时候,在那个公司参与用OpenCV c++版本的开发公司自己的CV库.体会还比较深,现在回想起来,大概会有这么一些建议: 1. C++需要多了解一下,建议看看Bjarne大神的书 Op

OpenCV:基于MFC的视频播放器和图片读取器

实例工程包下载[OpenCV:基于MFC的视频播放器和图片读取器] 一.实现的功能 1.打开本地视频进行读取.播放.暂停.停止控制 2.图片打开功能分为两种:可使用"打开图片"按钮打开本地图片,或者点击comobox里面设定的图片列表选择并显示图片 二.编译环境 OS:Win8.1 x64 IDE:  Visual Studio 2013 OpenCV: 2.4.8 三.主要思路 1.视频的滑动条控制: ①主窗体的OnHScroll()响应函数负责响应slider滑动条的变化,这样就轻

OpenCV实现基于图像内容检索--视频播放(上)

最近要交个小作业,恰好刚开了博客园的博客,就想着把这个记下来当是做点笔记)=.=(,做的小作业的题目是基于图像内容的内容检索,主要是包括OpenCV和使用ActiveX插件两种方法来播放,这部分就写关于使用控件来实现视频播放的内容吧. [可能这几篇文章只是应用型的小作业,水平可能适合初学者看看,大牛略过就行] 开发环境: Win7+VS2012+OpenCV 1.首先,打开VS2012,文件-->新建-->项目-->MFC应用程序,输入项目"名称"为Video,点击&

OpenCV 入门示例之三:视频播放控制

前言 在前文中给出了一个非常简短的视频播放程序,但它没有实现常规视频播放器中的播放滚动条功能,本文对此视频播放器程序加以改进,实现此功能. 滚动条的实现思路 滚动条的功能实质上就是从一帧跳跃到另外一帧,它的实现框架大致是这样的: 1. 首先要定义一个全局变量,在每次滚动条位置发生改变时记录下来. 2. 然后定义一个回调函数 ,这个回调函数会在滚动条位置发生改变时自动执行.本文的程序中,回调函数具体的作用就是把程序的当前帧序更新为 1 中获取到的新的帧序. 3. 获取当前的总帧数. 4. 以 2

[学习OpenCV攻略][005][视频播放控制]

cvSetCaptureProperty(视频,属性,属性值) 设置视频的属性,属性可以是宏CV_CAP_PROP_POS_FRAMES 视频帧的位置 cvGetCaptureProperty(视频,属性) 得到视频的属性值,属性可以是宏CV_CAP_PROP_FRAMES_COUNT视频帧数,CV_CAP_PROP_FRAME_WIDTH视频的宽度,CV_CAP_PROP_FRAME_HEIGHT cvCreateTrackbar(滚动条名称,窗口名称,滑动条位置,总帧数,回调函数) 在窗口中

opencv视频学习第五课(视频播放控制)笔记整理

这次是学习怎么创建一个控制台的滚动条,并且使用它控制视频的播放.为了测试一些东西,改编了视频教程中的代码. #include "stdafx.h" #include "highgui.h" #include "cv.h" CvCapture* g_capture = NULL; //记录滚动条的当前位置 int g_slider_pos = 0; //对视频帧进行计数的变量 int frame_count = 0; void onTrackbar

MFC中利用OpenCV实现视频播放

近期项目中在学习全景相机相关知识 当然首先要开始将基本的MFC学会才能封装SDK 首先建立MFC对话框工程 具体的详细知识就不说了,网上有很多的教程. 添加如下控件 中间显示部分是picture control控件 采用定时器更新picture 显示框 首先包含opencv相关的头文件,在CUpanoCameraDlg.h中添加以下变量 private: CRect rect; CStatic* pStc; //标识图像显示的Picture控件 CDC* pDC; //视频显示控件设备上下文 H

Opencv 简单视频播放器

[cpp] view plain copy print? // C++ header and namespace #include <iostream> #include <string> #include <cstdlib> using namespace std; // Opencv header and namespace #include <opencv2/core/core.hpp> #include <opencv2/highgui/hig