OpenCV学习笔记之 播放及对视频的简单处理

       首先,我们对视频的处理是通过对视频中每一帧的处理进行的。

       一般地,播放并处理一段视频有以下几种基本操作:读取视频,获取视频参数,获取视频帧,对视频帧添加各种操作。我们用一段代码来说明一下。


//功能:读取指定路径的视频;
//          对视频进行一系列操作,包括:灰度化 --> 滤波 --> 二值化 --> 形态学处理。
//环境:VS2015+opencv2.4.9
     
#include<iostream>
#include<highgui.h>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main(void)
{

    //打开视频文件
    VideoCapture capture("D:/360Downloads/AVI vedio/VID20180131083455.avi");

    //isOpen判断视频是否打开成功
    if (!capture.isOpened())
    {
        cout << "Movie open error" << endl;
        return -1;
    }
    
    //获取视频帧率
    double rate = capture.get(CV_CAP_PROP_FPS);
    cout << "帧率为:" << " "<< rate << endl;
    //获取总帧数
    int total_rate = capture.get(CV_CAP_PROP_FRAME_COUNT);
    //输出帧总数
    cout << "总帧数为:" << " " << total_rate << endl;
    
    Mat frame;   //定义一个Mat类,用于存放视频帧
    
    //定义形态学处理所需的内核
    Mat element=getStructuringElement(MORPH_RECT,Size(3,3));
    //建立一个窗口用于显示视频
    namedWindow("Movie Player");

    while (1)
    {
        //读取视频帧
        if (!capture.read(frame))
            break;
        
        //添加操作
        cvtColor(frame,frame,CV_BGR2GRAY);               //颜色空间转换
        medianBlur(frame, frame,3);                      //中值滤波
        threshold(frame, frame, 55, 220, 0);             //二值化,显示大于55的像素值,其余为220
        morphologyEx(frame, frame, MORPH_OPEN, element); //开运算
        
        imshow("Movie Player", frame);        
        
        //获取按键值
        char c = waitKey(33);
        if (c == 27)           //27为"Esc"的ASCII码值,表示按下"Esc"时退出视频播放
            break;
    }
    
    return 0;
}



      

     

     


一、问题的提出 做运动分析检测,需要有一定的素材视频,但是素材视频的编码OpenCV不能识别,无法对指定的视频做实验,怎么素材视频通用化使得OpenCV能正常识别? 二、解决的方法 (1)素材视频总是有配套的播放器来播放,那么使用这个播放器查看总帧数,和总播放时长,计算出帧率为25,表示一秒钟播放25帧图像。 (2)用这个配套的播放器对素材视频进行逐帧步进抓图,这个操作很辛苦,一秒钟25帧,那么抓25帧是一秒,素材视频30秒就要抓750帧,很辛苦。 (3)帧抓完后,发现一帧图1.4M,以位图格式保存,那么30秒就要达到1G的存储空间,怎么办?没办法,不知道怎么去获取解码器和安装解码器,就只能这么忍受。察看到逐帧步进抓图的存储是按序列编排文件名,那么要修改好使得每个文件名都是以规则“文件名”+“帧序列”的形式存在。 (4)编写根据帧序列图生成帧率25的视频的代码 三、问题的解决: (1)解决一个字符串合并的问题: 由于字符串参数有个赋值格式化设置函数叫做Format,要实现多类型参数的字符串化,可以参照如下示例: float f = 0.0; char sz[128]; int n = 1; CString str; str.Format("%f%s%d",f,sz,n); (2)采用MJPG的编码格式依次将这些图像序列写入到视频中保存起来,采用MJPG的编码格式是因为操作系统自带了Media player播放器,这种编码格式属于无压缩的,Media player可以识别播放。 (3)实现方式是使用MFC对话框窗体的按钮事件来进行视频的逐帧写图,由于帧数多,那么在写入器循环做写这个动作的时候,整个程序是假死在那里直到写入器的写入操作终结。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值