OpenCV学习笔记(二)读取视频文件,双窗口显示与保存

来源:互联网 发布:剑三藏剑正太脸数据 编辑:程序博客网 时间:2024/04/30 11:55

  这里主要是参照别人博客来修改实现的,其功能是读取2个视频文件,分别在两个窗口中播放,每个窗口都加入一个进度条,可以自行用鼠标控制播放进度。

一、系统环境

Windows7 64位
Visual Studio 2013 + OpenCV2.4.13

二、新建win32控制台程序,工程名为:video_test

注意要记得添加一个属性表(配置OpenCV),不懂的请参见我的博客OpenCV学习笔记(一):OpenCV2.4.13+VS2013环境配置

stdafx.h

//#define _CRT_SECURE_NO_DEPRECATE#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1#pragma once#include "targetver.h"#include <stdio.h>#include <tchar.h>// TODO:  在此处引用程序需要的其他头文件
Note:放在最前面的两行代码,#define _CRT_SECURE_NO_DEPRECATE,#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1主要是为了解决如下图所示的bug:


原因是Visual C++ 2013使用了更加安全的 run-time library routines。这种微软的警告,主要因为那些C库的很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。 
video_test.cpp

#include "stdafx.h"#include <iostream>  #include <cv.h>  #include <cxcore.h>  #include <highgui.h>  using namespace std;// 初始化进度条的位置  int g_slider_position1 = 0;int g_slider_position2 = 0;CvCapture* g_capture1 = NULL;//CvCapture结构体:存储图像捕获的信息CvCapture* g_capture2 = NULL;// 定义回调函数用于播放进度的控制   void onTrackbarSlide1(int pos1) //回调函数{cvSetCaptureProperty(g_capture1, CV_CAP_PROP_POS_FRAMES, pos1);//设置视頻获取属性,                                                      //CV_CAP_PROP_POS_FRAMES单位为帧数的位置}void onTrackbarSlide2(int pos2){cvSetCaptureProperty(g_capture2, CV_CAP_PROP_POS_FRAMES, pos2);}int _tmain(int argc, _TCHAR* argv[]){// 建立播放窗口  cvNamedWindow("Video Test 1", CV_WINDOW_AUTOSIZE);cvNamedWindow("Video Test 2", CV_WINDOW_AUTOSIZE);// 捕捉视频文件  g_capture1 = cvCreateFileCapture("E:\\VS 2013\\video_test\\video1.mp4");//通过参数设置,                                                                                //确定要读入的视频文件g_capture2 = cvCreateFileCapture("E:\\VS 2013\\video_test\\video2.mp4");// 读取、显示视频文件的帧数  int frames1 = (int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_COUNT);                                                                               cout << "frames1 = " << frames1 << endl;// 建立进度条  if (frames1 != 0)cvCreateTrackbar("Position","Video Test 1",&g_slider_position1,frames1,onTrackbarSlide1);int frames2 = (int)cvGetCaptureProperty(g_capture2, CV_CAP_PROP_FRAME_COUNT);cout << "frames2 = " << frames2 << endl;if (frames2 != 0)cvCreateTrackbar("Position","Video Test 2",&g_slider_position2,frames2,onTrackbarSlide2);// 读取视频文件信息  double fps1 = (int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FPS);//帧率double fps2 = (int)cvGetCaptureProperty(g_capture2, CV_CAP_PROP_FPS);CvSize size1 = cvSize((int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_WIDTH), //视频1流中的帧宽度(int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_HEIGHT));//视频1流中的帧高度CvSize size2 = cvSize((int)cvGetCaptureProperty(g_capture2, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(g_capture2, CV_CAP_PROP_FRAME_HEIGHT));// 创建 VideoWriter   CvVideoWriter* wrVideo1 = cvCreateVideoWriter("E:\\VS 2013\\video_test\\video3.avi",                                                         CV_FOURCC('M', 'J', 'P', 'G'), fps1, size1);CvVideoWriter* wrVideo2 = cvCreateVideoWriter("E:\\VS 2013\\video_test\\video4.avi",                                                         CV_FOURCC('M', 'J', 'P', 'G'), fps2, size2);int frs = 0;// 开始播放并保存视频  IplImage* frame1;IplImage* frame2;while (frs < frames1 && frs < frames2){// 获取、显示源文件的帧画面  frame1 = cvQueryFrame(g_capture1);if (!frame1) break;cvShowImage("Video Test 1", frame1);frame2 = cvQueryFrame(g_capture2);if (!frame2) break;cvShowImage("Video Test 2", frame2);// 保存:将当前帧写入到目标视频文件  cvWriteFrame(wrVideo1, frame1);cvWriteFrame(wrVideo2, frame2);// 若按下 ESC 键,则退出程序  char c = cvWaitKey(33);if (c == 27) break;}// 释放内存,关闭窗口  cvReleaseCapture(&g_capture1);cvReleaseCapture(&g_capture2);cvReleaseVideoWriter(&wrVideo1);cvReleaseVideoWriter(&wrVideo2);cvDestroyWindow("Video Test 1");cvDestroyWindow("Video Test 2");return 0;}
跑一下基本没问题了,这样就可以读取两个视頻并显示出来了,然后去目录下就可以看到被保存的视频文件了。



0 0
原创粉丝点击