首页 > 技术文章 > opencv3.2.0实现连续图片合成avi视频

wwwwtt 2017-12-10 11:24 原文

##名称:利用videowriter实现多张连续图片合成avi视频
##平台:QT5.7.1+OpenCV3.2.0
##日期:2017年12月10日

/**************新建QT控制台程序**************/
#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    Mat image;
    char filename[75]; //定义数组,其中数组大小大于等于图片的个数
    int isColor = 1;   //如果为0 ,可输出灰度图像
    int fps = 10;      //设置输出视频的帧率
    //int frameWidth = image.cols;   //单帧图片的宽
    //int frameHeight = image.rows;  //单帧图片的高

    VideoWriter writer("/home/ttwang/images/video_out.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), fps,
                        Size(640, 360),isColor);

    for(unsigned int i=0;i<1000;i++)
    {
        sprintf(filename,"/home/ttwang/images/image%d.jpg",i);//第二个参数是指定图片路径和图片名的一般式(image%d)
        image=imread(filename);//导入图片
        if (image.empty())
        {
           break;
        }
        waitKey(0);
      //cout << image.channels() << endl; //为了解决问题而打印查看图片的通道
      //cout << image.size() << endl;     //为了解决问题而打印图片的尺寸
        writer.write(image); //
    }
}
错误调试分析:

#起初定义单帧图片尺寸时,读取原图的行和列,如下定义时:
int frameWidth = image.cols;   //单帧图片的宽
int frameHeight = image.rows;  //单帧图片的高

#VideoWriter的参数Size()如是这样读:
Size(frameWidth,frameHeight)

#出现如下错误:
OpenCV Error: Assertion failed (img.cols == width && img.rows == height && channels == 3) in write, 
file /home/ttwang/opencv-3.2.0/modules/videoio/src/cap_mjpeg_encoder.cpp, line 829 调试语句: #1.打印图片的通道数看是否为3 cout << image.channels() << endl; 打印输出:3 说明没有错误 #2.可能是单帧尺寸不对, cout << image.size() << endl; 打印输出:640X360 为此将Size()的参数改为 Size(640,360) 编译通过 对于为什么我那样定义是错的,始终没有搞明白,希望有人解答

 

推荐阅读