Opencv基礎知識-----視頻的讀取和操作


 

Opencv讀取視頻代碼

 

#include "stdafx.h"
#include"highgui.h"
 
int main(int argc,char* argv[])
{
                cvNamedWindow( "avi");
                CvCapture* capture = cvCreateFileCapture( "D:\\sample.avi");
                IplImage* frame;
                 while(1)
                {
                                frame = cvQueryFrame(capture);
                                 if(!frame) break ;
 
                                cvShowImage( "avi",frame);
                                 char c = cvWaitKey(33);
                                 
                                 if(c == 27)  break;
                }
                cvReleaseCapture(&capture);
                cvDestroyWindow( "avi");
                 return 0;
}

 

結構體 CvCapture

  CvCapture 是一個結構體,用來保存圖像捕獲所需要的信息。 opencv提供兩種方式從外部捕獲圖像:

一種是從攝像頭中,
一種是通過解碼視頻得到圖像。
     兩種方式都必須從第一幀開始一幀一幀的按順序獲取,因此每獲取一幀后都要保存相應的狀態和參數。
     比如從視頻文件中獲取,需要保存視頻文件的文件名,相應的解碼器類型,下一次如果要
獲取將需要解碼哪一幀等。 這些信息都保存在CvCapture結構中,每獲取一幀后,這些信息
都將被更新,獲取下一幀需要將新信息傳給獲取的 api接口
 
cvCreateFileCapture(char*name)
通過輸入要讀取的avi文件的路徑,然后,該函數返回一個指向 CvCapture結構體的指針。
cvQueryFrame(capture)
輸入一個CvCapture 類型的指針,該函數主要功能是將視頻文件的下一幀加載到內存。與 cvLoadImage的不同之處是,該函數不重新分配內存空間。
C=cvWaitKey(33)
當前幀被顯示后,等待 33毫秒。如果用戶觸發了一個按鍵, c會被設置成這個按鍵的 ASCII碼,否則會被設置成 -1。
cvWaitKey(33) 在此處的另外一個作用是,控制幀率。
 
cvReleaseCapture(&capture)
釋放為 CvCapture結構體開辟的內存空間
關閉打開的 AVI文件相關的文件句柄

視頻的使用和操作具體說明:

  • 對攝像頭初始化捕捉
    • CvCapture* capture=cvCaptureFromCAM(0);//從攝像頭0捕捉
  • 對文件初始化捕捉
    • CvCapture* capture=cvCaptureFromAVI("/home/lubo/....avi");//從文件捕捉
  • 捕捉某一幀
    • IplImage* img=0;
    • 方法一
      • if(!cvGrabFrame(capture)){ //捕獲失敗 exit(0); }
      • img=cvRetrieveFrame(capture);
    • 方法二
      • img=cvQueryFrame(capture);
    • 如果同時從幾個攝像頭捕捉,應該先從每一個攝像頭抓取圖像,抓取結束后再捕捉圖像
  • 釋放捕捉源(圖像是由捕捉函數分配和釋放的,所以不要釋放圖像)
    • cvReleaseCapture(&capture);

獲取視頻幀信息

  • 獲得捕捉裝置的屬性
        cvQueryFrame(capture); int frameH=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);//視頻的高
                    CV_CAP_PROP_FRAME_WIDTH//視頻的寬 CV_CAP_PROP_FPS //每秒幀數
                    CV_CAP_PROP_FRAME_COUNT//幀數 CV_CAP_PROP_FOURCC //4-character code of codec
                    CV_CAP_PROP_BRIGHTNESS//亮度 CV_CAP_PROP_CONTRAST//對比度
                    CV_CAP_PROP_SATURATION//飽和度 CV_CAP_PROP_HUE//色調
  • 獲得幀的當前位置
           CV_CAP_PROP_POS_MSEC //視頻當時的毫秒數或者視頻的時間戳
           CV_CAP_PROP_POS_FRAME//0-based
                             CV_CAP_PROP_AVI_RATIO//視頻文件的相對位置

保存視頻文件

  • 初始化視頻寫入
        CvCideoWriter* writer=0;
        int isColor=1;
        int fps=25;//30
        int frameW=640;
        int frameH=480;
    writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),fps,cvSize(frameW,frameH),isColor);
  • 視頻寫入的格式還有
        CV_FOURCC('M','J','P','G');
        CV_FOURCC('M','P','4','2');
                    CV_FOURCC('D','I','V','3'); 
        CV_FOURCC('D','I','V','X');
        CV_FOURCC('U','2','6','3');
        CV_FOURCC('I','2','6','3');
              CV_FOURCC('F','L','V','1');
  • 寫入視頻文件
        IplImage* img=0;
        int nFrames=50;
        for(int i=0;i<nFrames;i++){
          cvGrabFrame(capture);
          img=cvRetreveFrame(capture);
                cvWriteFrame(writer,img);
      }
  • 釋放視頻寫入

    cvReleaseVideoWriter(&writer);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM