三水 发表于 2011-9-23 20:40:31

OpenCV学习笔记之——视频文件处理

本帖最后由 三水 于 2011-9-29 22:02 编辑

第一段测试代码
      
    #include "stdafx.h"
    #include <iostream>
    #include <cv.h>
    //#include <cvaux.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <string>
    using namespace std;
    int main()
    {
       IplImage *frame = NULL;
       CvCapture *capture = NULL;
      capture = cvCaptureFromAVI("D:\\123\\1.AVI");
      frame = cvQueryFrame(capture);
       cvNamedWindow("frame");
       while(frame){
          cvShowImage("frame", frame);
          cvWaitKey(20);
          cout << "Frame Grabbed." << endl;
          frame = cvQueryFrame(capture);
       }
       return 0;
    }
运行后界面显示如下

前面的不再做过多解析@@

其实我也想不起来了,四天没碰。。浪费时间啥也没记住。。

cvCaptureFromAVI()通过参数读入AVI文件及其所有信息并返回一个CvCapture指针,对人AVI视频时参数为该指针的cvQueryFrame()将为图像分配内存,与图像显示不同,不需要cvLoadImage为图像分配内存。CvCapture被释放后,每一帧图像的内存空间也将被释放。
cout函数让图像播放时将不断输出Frame Grabbed.



第二段测试代码
      
    #include "stdafx.h"
    #include <iostream>
    #include <cv.h>
    #include <cvaux.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <string>
    // 使用标准命名空间
        using namespace std;

        CvCapture* g_capture1 = NULL;

    int main(int argc, char** argv )
        {
                // 建立播放窗口
               cvNamedWindow( "Video Test 1", CV_WINDOW_AUTOSIZE );
               // 捕捉视频文件
               argv="D:\\123\\1.avi";
               g_capture1 = cvCreateFileCapture( argv );
               // 开始播放并保存视频
               IplImage* frame1;   
               while(1)
               {
                  // 获取、显示源文件的帧画面
                  frame1 = cvQueryFrame( g_capture1 );
                  if( !frame1 ) break;
                  cvShowImage( "Video Test 1", frame1 );
                  // 若按下 ESC 键,则退出程序
                  char c = cvWaitKey(33);
                  if( c==27 ) break;
               }
               // 释放内存,关闭窗口
               cvReleaseCapture( &g_capture1 );   
               cvDestroyWindow( "Video Test 1" );

               return 0;
        }






下面段函数我电脑上运行不出结果。。待解决
    // test2_video.cpp : Defines the entry point for the console application.
    //
      
    #include "stdafx.h"
    #include <iostream>
    #include <cv.h>
    //#include <cvaux.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* g_capture2 = NULL;
      
    // 定义回调函数用于播放进度的控制   
    void onTrackbarSlide1( int pos1 )
    {
   cvSetCaptureProperty( g_capture1, CV_CAP_PROP_POS_FRAMES, pos1 );
    }
    void onTrackbarSlide2( int pos2 )
    {
   cvSetCaptureProperty( g_capture2, CV_CAP_PROP_POS_FRAMES, pos2 );
    }
      
      
    int main(int argc, char** argv )
    {
   // 建立播放窗口
   cvNamedWindow( "Video Test 1", CV_WINDOW_AUTOSIZE );
   cvNamedWindow( "Video Test 2", CV_WINDOW_AUTOSIZE );
      
   // 捕捉视频文件
   g_capture1 = cvCreateFileCapture( argv );
   g_capture2 = cvCreateFileCapture( argv );
      
   // 读取、显示视频文件的帧数
   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),
      (int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_HEIGHT));
   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(argv, CV_FOURCC('M','J','P','G'), fps1, size1);
   CvVideoWriter* wrVideo2 = cvCreateVideoWriter(argv, 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;
    }
呃,先贴过来,因为太多要测试的,边测试边写

三水 发表于 2011-9-24 11:49:04

本帖最后由 三水 于 2011-10-3 12:08 编辑

    #include "stdafx.h"
    #include "cv.h"
    #include "highgui.h"
    #include <ctype.h>
    #include <stdio.h>
    int main( int argc, char** argv )
    {
      IplImage* img = 0;
      
      int nFrames = 50;
      CvCapture* capture = 0;
       CvVideoWriter *writer = 0;
       int isColor = 1;
      int fps = 25; // or 30
      int frameW = 640; //
      int frameH = 480; //
      
      if( argc == 1 || (argc == 2 && strlen(argv) == 1 && isdigit(argv)))
            capture = cvCaptureFromCAM( argc == 2 ? argv - '0' : 0 );
            if( !capture )
      {
            fprintf(stderr,"Could not initialize capturing...\n");
            return -1;
      }
         writer=cvCreateVideoWriter("D:\\out.avi",CV_FOURCC('X','V','I','D'),
      fps,cvSize(frameW,frameH),isColor);
    //存储视频文件 CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0
                for(int i=0;i<nFrames;i++)
                {
                        cvGrabFrame(capture); // 抓取帧
                        img=cvRetrieveFrame(capture); // 恢复图像
                        cvWriteFrame(writer,img); // 将帧添加入视频文件
                        //显示所抓视频
                        cvNamedWindow("Live", CV_WINDOW_AUTOSIZE);//创建窗口
                        cvShowImage("Live", img);//显示所抓视频
                        cvWaitKey(50); // wait 20 ms
                }
                cvReleaseVideoWriter(&writer);
    return 0;
    }

录制avi视频

#include "cv.h"
#include "highgui.h"
#include <ctype.h>
#include <stdio.h>
int main( int argc, char** argv )
{
    IplImage* img = 0;
   
    int nFrames = 500;
    CvCapture* capture = 0;
   CvVideoWriter *writer = 0;
   int isColor = 1;
    int fps = 25; // or 30
    int frameW = 640; //
    int frameH = 480; //
   
    if( argc == 1 || (argc == 2 && strlen(argv) == 1 && isdigit(argv)))
      capture = cvCaptureFromCAM( argc == 2 ? argv - '0' : 0 );
      if( !capture )
    {
      fprintf(stderr,"Could not initialize capturing...\n");
      return -1;
    }
    writer=cvCreateVideoWriter("D:\\out.mp4",CV_FOURCC('D','I','V','X'),
       fps,cvSize(frameW,frameH),isColor);
//存储视频文件CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0
for(int i=0;i<nFrames;i++)
{
cvGrabFrame(capture); // 抓取帧
img=cvRetrieveFrame(capture); // 恢复图像
cvWriteFrame(writer,img); // 将帧添加入视频文件
//显示所抓视频
cvNamedWindow("Live", CV_WINDOW_AUTOSIZE);//创建窗口
cvShowImage("Live", img);//显示所抓视频
cvWaitKey(20); // wait 20 ms
}
cvReleaseVideoWriter(&writer);
return 0;
}

录制mpga视频

三水 发表于 2011-9-24 12:31:26

本帖最后由 三水 于 2011-10-3 12:03 编辑

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) //消除console窗口
//此处稍后写学习笔记讲解


//初始化进度条的位置
int g_slider_position=0;
CvCapture* g_capture=NULL;



//进度条的回调函数,播放进度控制
void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);//设置视频
}



int main(int argc, char* argv[])
{
//创建播放窗口
    cvNamedWindow("Window Name", CV_WINDOW_AUTOSIZE);
//捕获视频
    g_capture=cvCreateFileCapture("D:\\out1.avi");
//获取视频的帧数
int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
//建立进度条
if(frames!=0)
{
    cvCreateTrackbar("Trackbar Name","Window Name",&g_slider_position,frames,onTrackbarSlide);
}
//捕获、播放视频
    IplImage* frame;
    while(1)
{
    frame=cvQueryFrame(g_capture);
    if( !frame ) break;
//获取视频播放位置
int trapos=(int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES);
//设置进度条位置,使其和视频播放同步
cvSetTrackbarPos("Trackbar Name","Window Name", trapos);
//播放视频
    cvShowImage("Window Name",frame);
//等待按键
    char c=cvWaitKey(33);
    if(c==27) break;
}
//释放资源
    cvReleaseCapture(&g_capture);
    cvDestroyWindow( "Window Name");

return 0;
}

添加进度条成功


呃。由于是上一条录制视频的时候录制的自己

所以播放也就播放自己了。。截图截个搓搓的头发吧


int g_slider_position=0;
CvCapture* g_capture=NULL;
为进度条添加全局变量。而回调函数需要使用CvCapture对象,故将它定义为全局变量。为增加程序可读性,前加g_方便修改者寻找。

void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);//设置视频
}
定义一个在进度条被拖动时调用的回调函数。拖动条位置会被作为一个32位的整数以参数形式传入。
CV_CAP_PROP_POS_FRAMES表示我们以帧数来设置读入位置,FRAMES若用AVI_RATIO代替表示通过视频长度比例来设置读入位置。最后,新的进度条位置作为参数传入。
int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
需要从CvCapture结构查询数据时,可使用cvGetCaptureProperty函数,我们希望获得视频文件的总帧数以对进度条进行设置。
if(frames!=0)
{
    cvCreateTrackbar("Trackbar Name","Window Name",&g_slider_position,frames,onTrackbarSlide);
}
借助cvCreateTrackbar()创建进度条,可设置进度条名称和所属窗口。将一个变量绑定到进度条来表示其进度条最大值及一个回调函数(不需要回调函数的时候为空,进度条被拖动时触发)。cvCreateTrackbar()返回帧数为0时,进度条不会被创建。因为有些编码方式无法获得帧数,这时候只能播放而无法获得进度条。

andy2013 发表于 2011-12-30 16:17:54

怎么只看到头发,呵呵!上个完整的嘛:D

プ汏坏疍 发表于 2012-1-2 11:09:41

请问一下三水老大,这个软件支持用摄像头拍视频吗?另外视频支不支持实时传输到电脑吗?最好可以无线传输那种,如果能有这些功能的话我也想向你们这些高手学习:loveliness:

三水 发表于 2012-1-2 15:15:05

プ汏坏疍 发表于 2012-1-2 11:09 static/image/common/back.gif
请问一下三水老大,这个软件支持用摄像头拍视频吗?另外视频支不支持实时传输到电脑吗?最好可以无线传输那 ...

是的,演示视频就是笔记本自带的摄像头拍的,可以实时处理视频。无线也应该可以的,我也才学opencv

プ汏坏疍 发表于 2012-1-2 15:29:11

{:soso_e142:}谢谢你的贴子,我正在打算今年能不能做出一款具有视频传输功能的小车,看来在这里找到方向了,呵呵。它的语言是C#吗?貌似俺没有学过这方面的编程语言,纠结。

三水 发表于 2012-1-2 17:58:52

プ汏坏疍 发表于 2012-1-2 15:29 static/image/common/back.gif
谢谢你的贴子,我正在打算今年能不能做出一款具有视频传输功能的小车,看来在这里找到方向了, ...

c/c++的{:3_62:}加油!我也想有空弄弄视频处理。

珜羽 发表于 2012-6-3 02:31:02

图挂了。。。

弘毅 发表于 2012-6-3 09:00:47

珜羽 发表于 2012-6-3 02:31 static/image/common/back.gif
图挂了。。。

囧。。刷新下试试,我这里看这是正常的。

珜羽 发表于 2012-6-3 11:09:03

弘毅 发表于 2012-6-3 09:00 static/image/common/back.gif
囧。。刷新下试试,我这里看这是正常的。

{:2_36:}难道就我电脑问题???

麽麽茶㊣ 发表于 2012-6-27 16:40:40

三水 发表于 2011-9-24 12:31 static/image/common/back.gif
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"


cvCreateTrackbar("滚动条名字","窗口名",&最小值,最大值,0);
写在main函数里就行了其实

三水 发表于 2012-6-28 00:36:50

麽麽茶㊣ 发表于 2012-6-27 16:40 static/image/common/back.gif
cvCreateTrackbar("滚动条名字","窗口名",&最小值,最大值,0);
写在main函数里就行了其实

多多指教。。我当时玩了就没怎么玩了,准备先做重新玩

百吴聊赖 发表于 2012-8-6 19:28:32

新手有点儿晕

伊宁 发表于 2013-1-2 17:49:44

:o厉害啊~希望能够一起探讨啊~
页: [1] 2
查看完整版本: OpenCV学习笔记之——视频文件处理