opencv学习 视频帧截取

来源:互联网 发布:网络教育机构 编辑:程序博客网 时间:2024/06/05 06:00

做视频检测的时候经常需要对视频进行图像截取,可以利用opencv进行简单的截图操作,但截取速率比较慢,适用于几千张左右的截图,熟悉matlab的请无视= =

代码如下:

#include <cstring>  #include <opencv2\opencv.hpp>#include "cv.h"#include "highgui.h"using namespace std;int main(){    CvCapture *capture;    capture = cvCreateFileCapture("C:\\Users\\Ruby\\Desktop\\source\\video\\7.wmv");    IplImage *frame;    int n = 1, m = 1;    char *cstr = new char[20];    //下面参数分别代表视频的高、宽、fps、帧总数    int frameH = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);    int frameW = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);    int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);    int numFrames = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);    printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n\tframe numbers : %d\n", frameH, frameW, fps, numFrames);    while (m<=48950)//截取前48950帧    {        frame = cvQueryFrame(capture);        if (!frame)            break;        if (m % 20 == 0){//每20帧取一帧            sprintf(cstr, "%s%d%s", "imag7.", n++, ".jpg");            cvSaveImage(cstr, frame);            if (cvWaitKey(33) >= 0)                break;        }        m++;    }    return 0;}

注意项:

  1. 上一篇博客中使用的是Mat结构体,为Opencv2.0版本以来所使用的数据结构;IplImage*格式是Opencv1.0时代基于C语言接口而建立的图像存储格式,退出前忘记release的话会造成内存泄漏,用起来比较麻烦(本文随便试试。。)。而且2.0版本后许多函数名称和Matlab中的一样,如imread、imwrite、imshow等,较为方便。

    具体知识请参考浅墨大大的博客
    http://blog.csdn.net/column/details/opencv-tutorial.html

  2. Opencv提供一个函数cvCreateFileCapture(Capture* cap,int property_index)来获取视频文件的一些属性,这是其中的OpenCV中属性的一些宏定义:

#define CV_CAP_PROP_POS_MSEC       0     //以毫秒计算的当前的位置#define CV_CAP_PROP_POS_FRAMES     1  //以帧计算当前的位置#define CV_CAP_PROP_POS_AVI_RATIO  2  //视频的相对位置,从0 到 1 前面这三个参数是跟视频播放,读取相关的动态信息#define CV_CAP_PROP_FRAME_WIDTH    3    //帧宽#define CV_CAP_PROP_FRAME_HEIGHT   4   //帧高度#define CV_CAP_PROP_FPS            5    //帧率#define CV_CAP_PROP_FOURCC         6   // 字符编码方式#define CV_CAP_PROP_FRAME_COUNT    7 //视频帧数#define CV_CAP_PROP_FORMAT         8   //视频格式#define CV_CAP_PROP_MODE           9  //#define CV_CAP_PROP_BRIGHTNESS    10   //亮度#define CV_CAP_PROP_CONTRAST      11  //对比度#define CV_CAP_PROP_SATURATION    12 //饱和度#define CV_CAP_PROP_HUE           13  //色调#define CV_CAP_PROP_GAIN          14 //增益#define CV_CAP_PROP_EXPOSURE      15 //曝光#define CV_CAP_PROP_CONVERT_RGB   16 //#define CV_CAP_PROP_WHITE_BALANCE 17 //白平衡#define CV_CAP_PROP_RECTIFICATION 18 

部分视频属性

  • sprintf

顺带讲一个c语言字符串拼接的知识吧,本文用于创建图像保存文件及各帧图像名称,加上#include <cstring>即可。

sprintf(cstr, "%s%d%s", "images\\image", n++, ".jpg")

第一个参数cstr为目标串,值为后面一系列字串的拼接体;
第二个参数为后面各字串原本的类型格式,共同写在一个双引号中;
第三个参数(即后面所有的)为需要进行拼接的各种类型值;
还有就是只要cstr长度足够,可以对任意个字串进行拼接并赋给它。

还有一个长得挺像的函数sscanf

  • sscanf

PAT编程考试中可以使用sscanf实现字符串到数字的转变(或者数字到字符串),如字符串‘1234’到整形数字1234,十分便捷(其实是懒233),其他众多功能请自行百度
(切割字符串等)

char str[20] = "1234";int num;sscanf(str, "%d", &num);//num中为整形数字1234
3 0
原创粉丝点击