分享

opencv:实现将图片生成视频

 cyy_1212 2014-05-22

 实验功能:将多张bmp彩色图片生成一个avi格式的灰度视频文件。

      在试验过程中,需要注意一下几点:

  1.输出视频文件命名的处理和视频帧率的选择

  2.输出视频文件格式的选择,好像opencv支持2种,一种是MIP1,和MJPG。但是试验过程中发现如果选择MIP1不仅输出视频质量非常差,且帧率不能控制。

  3.关于视频输出是否为彩色问题见代码注释部分。

  下面是工程代码:

复制代码
// generate_vedio.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, unsigned char* argv[])
{
    String str_name="WavingTrees/b00";
    char str[4];

    Mat img_src,img_dst;
    vector<Mat> img_gray;

    img_src=imread("WavingTrees/b00000.bmp");

    //使用VideoWriter时,如果需要写视频的文件不存在,则新建一个,如果存在,则必须是合法的视频文件,否则下面的语句会报错
    //如果选择PIM1格式时,输出视频的帧率不能手动选择,且输出视频效果非常糟糕
    //VideoWriter output_src("demo_src.avi",CV_FOURCC('P','I','M','1'),2,img.size(),1);//输出彩色视频
    //VideoWriter output_dst("demo_dst.avi",CV_FOURCC('P','I','M','1'),25,img.size(),0);//输出灰度视频

    //当用MJPG格式时,可以选择输出的帧率,且视频输出的效果也要好很多,所以一般采用这种格式输出
    //最后一个参数isColor如果为非0的话,则表示输出3通道彩色视频,否则当isColor=0时输出为单通道黑白灰度视频
    //不过此时当放入视频的图片为单通道图片时,输出的视频虽然是黑白灰度的,但是确同时有3幅图出现,即宽度压缩了3倍
    VideoWriter output_src("demo_src.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//输出灰度视频
    VideoWriter output_dst("demo_dst.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//输出灰度视频

    int i=-1;


    namedWindow("src",WINDOW_AUTOSIZE);
    while(1)
    {
        i++;

        /****图片名字读取前的处理****/
        _itoa_s(i,str,10);
        if(i<10)
            str_name+="00";
        else if(i<100)
            str_name+="0";
        str_name+=str;
        str_name+=".bmp";
        if(256==i)
            return 0;

        /****输出原彩色视频****/
        img_src=imread(str_name);
        if(img_src.empty())
            return 0;
        output_src<<img_src;

        /****输出目标灰色视频****/
        //这里用split函数的目的是为了给vector<Mat>型变量确定边界,如果没有此语句,
        //则下面使用img_gray[1]就会认为是错误的
        split(img_src,img_gray);
        cvtColor(img_src,img_gray[1],CV_BGR2GRAY);//这样输出的是彩色视频
        //如果其它通道赋0的话,不是真正意义上的黑白灰度图,而是背景为蓝色的灰度图
    //    img_gray[0]=img_gray[2]=Mat::zeros(img_src.size(),img_gray[1].type());
        img_gray[0]=img_gray[2]=img_gray[1];//这样赋值才是真正意义上的黑白灰度图
        merge(img_gray,img_dst);

        //但这样输出的虽然是灰度视频,可是一副图像中包含了3个一样图,即图像宽度被压缩了3倍,why?
        //且此时不能输出3通道的图片,否则生成的视频不能播放
        output_dst<<img_dst;
    //    output_dst<<img;

        imshow("src",img_src);

        /****延时处理****/
        char c=(char)waitKey(10);
        if(27==c)
            return 0;

        str_name="WavingTrees/b00";
    }



    return 0;
}
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多