您的位置:首页 > 运维架构

opencv从入门到精通(1)-创建自己的视频播放器

2016-01-20 10:54 435 查看
本文默认你已经成功配置opencv并具有一定的c++基础,后续将由浅入深地介绍如何运用opencv进行图像处理与机器学习的具体实践,在熟悉opencv的同时也能对相关理论有更深刻的理解。opencv的具体配制方法参见:http://www.cnblogs.com/woshitianma/p/3853447.html

第一个程序——展示一个图像

c++中通过文件流可以将图像从磁盘中读入,处理后再输出到磁盘,但无法在屏幕上显示,运用opencv中的HighGUI工具箱则可以达到屏幕上及时显示的效果。
首先在visual studio中创建一个空的win32项目,新建一个cpp文件,输入下面的代码,并将图像文件放到项目的文件目录中。在解决方案资源管理器中可以打开项目所在文件夹。




代码如下:

#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{
IplImage* img = cvLoadImage("a1.ppm");
//IplImage是opencv中处理图像的数据结构,支持所有图像格式。
//cvLoadImage函数读入图像"a1.ppm",返回一个指针变量。
cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
//cvNamedWindow函数创建一个名为"Example1"的窗口,第二个参     //数CV_WINDOW_AUTOSIZE表示窗口大小自动调整与图像大小相同
cvShowImage("Example1",img);
//cvShowImage将图像img在窗口Example中显示出来。
cvWaitKey(0);
//cvWaitKey函数功能是等待双击事件,双击后退出。
cvReleaseImage(&img);//释放图像内存
cvDestroyWindow("Example1");//释放窗口内存
}


第二个程序-展示AVI视频

具体情形与图像差不多,但要设置一个循环来读取每一幅画面,同时能在视频结束或者你不想看时退出循环。
代码:


#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{

cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);//创建窗口
CvCapture* capture=cvCreateFileCapture("a2.mp4");
//cvCreateFileCapture函数作用是载入视频"a2.mp4"并返回指针到
//视频数据结构CvCapture创建的变量capture中,这时capture便包含视频    //中的所有信息。
IplImage* frame;//创建变量frame
while(1){
frame=cvQueryFrame(capture);/*cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存,返回一个对应当前帧的指针。与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。*/
if(!frame) break;//frame为空时退出循环
cvShowImage("Example2",frame);//显示当前画面
char c=cvWaitKey(33);//等待33毫秒,如有按键,将值赋给c
if(c==27) break;/*如果按键是“Esc”键(ASCLL 27),结束循环*/
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example2");
}


简单的视频播放器

接下来介绍cvSetCaptureProperty等函数在视频播放中加入进度条,这样就可以取得调戏自己家的进度条成就了。代码及注释如下:


#include <stdio.h>
#include <fstream>
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int        g_slider_position = 0;
CvCapture* g_capture         = NULL;
//定义onTrackbarSlide回调函数来输入滚动条的位置pos
void onTrackbarSlide(int pos) {
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
/*cvSetCaptureProperty函数用于设置capture结构的各种属性,CV_CAP_PROP_POS_FRAMES表示以帧数来设置读入位置。*/
}

int main(  ) {
cvNamedWindow( "Example3", CV_WINDOW_AUTOSIZE );
g_capture = cvCreateFileCapture( "a2.mp4" );
IplImage *foo = cvQueryFrame( g_capture);

//获取视频的帧数、画面的长和宽
int frames = (int) cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT );
int tmpw = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_WIDTH);
int tmph = (int) cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_HEIGHT );
printf("opencv frames %d w %d h %d\n",frames,tmpw,tmph);

cvCreateTrackbar( "Position", "Example3", &g_slider_position, frames, onTrackbarSlide );/*
cvCreateTrackbar函数用于创建进度条,参数含义:Position-进度条名字;Example3-需要加入进度条的窗口名字
&g_slider_position整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置;frames-滑块位置的最大值。
onTrackbarSlide-回调函数的指针*/

IplImage* frame;
frames = 0;
while(1) {
frame = cvQueryFrame( g_capture );
if( !frame ) break;
int frames = cvGetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES);//返回当前进度条位置对应的帧数
frames++;
cvSetTrackbarPos("Position","Example3",frames);//自动控制滚条位置
cvShowImage( "Example3", frame );
char c = (char)cvWaitKey(10);
if( c == 27 ) break;
}
cvReleaseCapture( &g_capture );
cvDestroyWindow( "Example3" );
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息