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

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

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

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

dfg
代码如下:

   #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;
}

效果如图,可能有的视频文件格式会出现问题,我用的是手机录制的视频

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值