视频文件写入转换之图像处理-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;
}
相关文章
相关标签/搜索