視頻文件寫入轉換之圖像處理-OpenCV應用學習筆記五

logo_thumb9_thumb

 

在《筆記二》中咱們作了視頻播放和控制的實現,僅僅算是完成了對視頻文件的讀取操做;今天咱們來一塊兒練習下對視頻文件的寫入操做:格式轉換。ide

實現功能:

    打開一個視頻文件play.avi,讀取文件內容,將每一幀圖像轉換爲對數極座標格式最後將轉換後的圖像序列寫入新的視頻文件play1.avi中。以下圖對比效果:函數

VX`$Y_NV3BW2B9{HL`WE%M4

0MXT`)8HWO`E`QF`9EOSIBV

函數精析:

  • CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frameSize, int isColor=1 )

  • 建立視頻文件寫入器
  • filename:新建視頻文件的名稱,fourcc:視頻壓縮的編碼格式,fps:視頻播放幀率,size:幀尺寸
  • isColor=0:但願獲得灰度幀進行編碼;!=0:但願獲得彩色幀進行編碼
  • OpenCV用宏CV_FOURCC()來制定編碼格式:CV_FOURCC('P','I','M,'1')—MPEG;CV_FOURCC('M','J','P','G')motion-jpeg
  • cvLogPolar(const CvArr* src, CvArr* dst, CvPoint2D32f center, double M, int  flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS )

  • 將圖像映射到極座標;
  • src:原圖像,dst:輸出圖像,center:轉換中心
  • 函數模仿人眼中心凹注視,用在旋轉不變的模板匹配和物體追蹤上
  • cvWriteFrame(CvVideoWriter* writer, const IplImage* image)

  • 將指定的圖像寫入到視頻文件中,必須是在打開視頻寫入器以前已經定義的相同圖像尺寸
  • writer:視頻寫入器,image:寫入的視頻幀
  • 附源代碼:

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

int  main(int argc,char** argv)
{
     if(argc == 3)
    {

    CvCapture* capture = 0;
    capture = cvCreateFileCapture(argv[1]);      //從指定文件獲取視頻流
    if(!capture) return -1;
    IplImage *bgr_frame = cvQueryFrame(capture); //從讀取的視頻流capture中讀取一幀
    double fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);//獲取視頻幀率
    CvSize size = cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),
                         (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
                                                //獲取視頻流中幀的尺寸

    /*cvCreateVideoWriter(新建視頻文件名,視頻壓縮編碼格式,幀率,尺寸)*/
    CvVideoWriter * writer = cvCreateVideoWriter(argv[2],CV_FOURCC('M','J','P','G'),
                                    fps,size); //建立視頻文件寫入器

    IplImage* logpolar_frame = cvCreateImage(size,IPL_DEPTH_8U,3);
    while((bgr_frame = cvQueryFrame(capture)) != NULL)
    {
    /*  將圖像映射到極座標cvLogPolar(原圖像,輸出圖像,轉換中心,量級水平,標誌位)*/
    cvLogPolar(bgr_frame,logpolar_frame,cvPoint2D32f(bgr_frame->width/2,
               bgr_frame->height/2),40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);
    cvWriteFrame(writer,logpolar_frame);//(視頻寫入器,要吸入的幀)
    }
    cvReleaseVideoWriter(&writer);
    cvReleaseImage(&logpolar_frame);
    cvReleaseCapture(&capture);
     }
    return 0;
}
相關文章
相關標籤/搜索