做视频检测的时候经常需要对视频进行图像截取,可以利用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;
}
注意项:
上一篇博客中使用的是Mat结构体,为Opencv2.0版本以来所使用的数据结构;IplImage*格式是Opencv1.0时代基于C语言接口而建立的图像存储格式,退出前忘记release的话会造成内存泄漏,用起来比较麻烦(本文随便试试。。)。而且2.0版本后许多函数名称和Matlab中的一样,如imread、imwrite、imshow等,较为方便。
具体知识请参考浅墨大大的博客
http://blog.csdn.net/column/details/opencv-tutorial.htmlOpencv提供一个函数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