OpenCV支持从摄像头或视频文件(AVI)中抓取图像并保存为另一视频文件.

 一、

  • 从摄像头获取初始化:

    CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0
  • 从视频文件filename.avi获取初始化:
    CvCapture* capture = cvCaptureFromAVI("infile.avi");
  • 抓取帧:
    IplImage* img = 0;
    if(!cvGrabFrame(capture)){               // 抓取一帧,失败退出
       printf("Could not grab a frame\n");
       exit(0);
    }
    img=cvRetrieveFrame(capture);            // 恢复获取的帧图像

    要从多个摄像头同时获取图像, 首先从每个摄像头抓取一帧. 在抓取动作都结束后再恢复帧图像.

  • 释放抓取源(和释放单幅图像时类似):
    cvReleaseCapture(&capture);

    注意由设备抓取的图像是由capture函数自动分配和释放的. 不要试图自己释放它.

  • 获取设备特性:

    cvQueryFrame(capture); // this call is necessary to get correct
                            // capture properties
    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);

    所有帧数似乎只与视频文件有关. 用摄像头时不对,奇怪!!!.

  • 获取帧信息:
    float posMsec    =        cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);
    int posFrames    =  (int) cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);
    float posRatio   =        cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);

    获取所抓取帧在视频序列中的位置, 从首帧开始按[毫秒]算. 或者从首帧开始从0标号, 获取所抓取帧的标号. 或者取相对位置,首帧为0,末帧为1, 只对视频文件有效.

  • 设定所抓取的第一帧标号:
    // 从视频文件相对位置0.9处开始抓取
    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO, (double)0.9);

    只对从视频文件抓取有效. 不过似乎也不成功!!!

 二、

  • 初始化视频存储器:

    CvVideoWriter *writer = 0;
    int isColor = 1;
    int fps      = 25;   // or 30
    int frameW   = 640; // 744 for firewire cameras
    int frameH   = 480; // 480 for firewire cameras
    writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),
                                fps,cvSize(frameW,frameH),isColor);

    其他有效编码:

    CV_FOURCC('P','I','M','1')     = MPEG-1 codec
    CV_FOURCC('M','J','P','G')     = motion-jpeg codec (does not work well)
    CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
    CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
    CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
    CV_FOURCC('U', '2', '6', '3') = H263 codec
    CV_FOURCC('I', '2', '6', '3') = H263I codec
    CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

    若把视频编码设为-1则将打开一个编码选择窗口(windows系统下).

  • 存储视频文件:
    IplImage* img = 0;
    int nFrames = 50;
    for(i=0;i<nFrames;i++){   cvGrabFrame(capture);           // 抓取帧
       img = cvRetrieveFrame(capture);   // 恢复图像
       cvWriteFrame(writer,img);       // 将帧添加入视频文件
    }

    若想在抓取中查看抓取图像, 可在循环中加入下列代码:

    cvShowImage("mainWin", img);
    key = cvWaitKey(20);            // wait 20 ms

    若没有20[毫秒]延迟,将无法正确显示视频序列.

  • 释放视频存储器:
    cvReleaseVideoWriter(&writer);

  下面通过完整的代码来熟悉以上所述内容:

 1 #include<cstring>
 2
 3 #include "cv.h"
 4 #include "highgui.h"
 5
 6 using namespace std;
 7
 8 int main()
 9 {
10      CvCapture *capture;
11      capture = cvCreateFileCapture("tree.avi");
12      assert(capture!=NULL);
13
14      IplImage *frame;
15      cvNamedWindow("camera",1);
16
17      int n = 1,m = 20;
18      char *cstr=new char[20];
19
20      while(m--)
21      {
22         frame = cvQueryFrame(capture);23         if(!frame)
24           break;
25
26       sprintf(cstr, "%s%d%s", "images\\image", n++, ".jpg");
27
28        cvShowImage("camera",frame);
29
30        cvSaveImage(cstr,frame);
31
32           if(cvWaitKey(33)>=0)
33                 break;
34     }cvReleaseCapture(&capture);
35      cvReleaseImage(&frame);
36      cvDestroyWindow("camera");
37
38     return 0;
39 }

  很容易发现,这里用到了c字符串拼接的相关知识,用于创建图像保存文件及各帧图像名称。下面简单补充一下:

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

    第一个参数cstr为目标串,值为后面一系列字串的拼接体;

    第二个参数为后面各字串原本的类型格式,当然是共同写在一个双引号中;

    第三个参数(即后面所有的)为需要进行拼接的各种类型值;

    还有就是只要cstr长度足够,可以对任意个字串进行拼接并赋给它。

  2、此程序中用到的读视频函数cvCreateFileCapture(filename)在上面简介总没有提到,但是对已存视频操作较方面。

  这里假定读取20帧图像,实现过后的结果为:

  1、在窗口每隔33秒显示一张图像;

  2、文件images中新生成了20张图像,名称分别为image1.jpg,image2.jpg,…,image20.jpg。

原文地址:http://www.cnblogs.com/tgyf/archive/2013/05/19/3086916.html

OpenCV学习之视频读取与帧的提取、显示及保存相关推荐

  1. opencv学习系列——视频格式的读取

    opencv学习系列--视频格式的读取 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. (1)打开视频文件 A. VideoCapture cap; ...

  2. OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并

    OpenCV与图像处理学习一--图像基础知识.读入.显示.保存图像.灰度转化.通道分离与合并 一.图像基础知识 1.1 数字图像的概念 1.2 数字图像的应用 1.3 OpenCV介绍 二.图像属性 ...

  3. 视频文件按帧抓取图像并保存

    一.原材料: win10,opencv3.0,vs2013,test.MP4.只需要配置好opencv的环境就好,3.0可以直接用MP4类型的视频数据. 二.实现功能: 1.显示视频的具体信息,帧数, ...

  4. opencv实现从视频读取每一帧图像保存并合成avi格式视频

    我的方法是用两个mat生成的对象,frame,src,frame是读取了视频的每一帧图像,并实现了保存,src是单纯用于合成视频.目前有出现两个bug,一个是生成的avi格式视频过大,一个是获取的图像 ...

  5. Opencv学习笔记——视频进度条

    有了视频进度条就可以认为是一个简单的视频播放器,关键是读取视频播放到的位置和设置进度滑块的位置. #include "stdio.h" #include "highgui ...

  6. 使用opencv从mp4视频中抽帧并保存

    使用oepncv有两种方法,一种是使用cvGrabFrame()+cvRetrieveFrame(),另一种是使用使用cvQueryFrame(). http://blog.csdn.net/augu ...

  7. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  8. 【opencv学习】【读取图像、视频、摄像头】

    今天学习opencv 一:读取图像 import cv2# 展示图像,封装成函数 def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitK ...

  9. Opencv(C++)笔记--视频读取、视频属性查看、视频循环播放

    目录 1--视频读取代码 2--视频属性查看 3--视频循环播放代码 1--视频读取代码 # include<opencv2/opencv.hpp> # include<cstdio ...

最新文章

  1. 关于springboot vue前后端分离项目部署到阿里云轻量服务器(前后端分开部署)
  2. 数字示波器使用中的欠采样
  3. Python自动化开发学习15-css补充内容
  4. 网络游戏,原罪和救赎
  5. python map reduce filter_Python map, reduce, filter和sorted
  6. 人脸关键点: DCNN-Deep Convolutional Network Cascade for Facial Point Detection
  7. 个人管理 - 我是这样偷着做架构的
  8. Spark Streaming 之foreachRDD 输出
  9. PHP 输入一棵二叉树和一个数字n,要求找出路径和为n的所有路径
  10. 浅谈Java新手入门书籍选择
  11. Java制作五子棋人机对战
  12. 【系统之家抢先发布】2011年10月最新GhostXP_SP3 PCOS技术快速装机版v6.5
  13. iOS 审核 苹果登陆失败
  14. android ListView的怪异现象
  15. 《操作系统真象还原》第三章 ---- 完善MBR 尝汇编先苦涩后甘甜而再战MBR!(内有闲聊)
  16. 用完加速器国内的网址打不开了?
  17. 管理电脑,让工作高效进行
  18. 总结:Grafana
  19. 如何使用JAVA代码生成一个简单的二维码
  20. 帝国cms文件不生成html,帝国cms迁移后无法生成栏目和文章静态页怎么办?

热门文章

  1. hive 的udf 函数使用
  2. H5 中的 new FileReader() 以及 识别上传的文件是否为图片
  3. lua userdata
  4. Oracle Sequence用plsql修改
  5. 谷歌升级Android分析应用程序
  6. LAMP 全功能编译安装 for CentOS6.3笔记(更新)
  7. mysql 出现Cannot delete or update a parent row: a...
  8. jsp+mysql开发论坛程序
  9. 信息系统项目管理系列之一:绪论
  10. APP和网站应该选择云主机还是服务器呢?