码迷,mamicode.com
首页 > 其他好文 > 详细

opencv视频播放

时间:2015-05-19 20:57:05      阅读:569      评论:0      收藏:0      [点我收藏+]

标签: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;

效果演示

  具体效果如下:
       技术分享

opencv视频播放

标签:opencv   图像处理   

原文地址:http://blog.csdn.net/u011630458/article/details/45849363

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!