Qt - OpenCV 连续图片生成视频

来源:互联网 发布:有钱人的三观 知乎 编辑:程序博客网 时间:2024/06/03 09:18

Qt - OpenCV 连续图片生成视频


此博客始创于:http://blog.csdn.net/lys211

转载请注明出处



主要是测试OpenCV将连续命名的图片转换成视频的过程。


OpenCV的安装请参考之前的文章。


主机环境

QT5.4.0 -mingw

OpenCV 3.0.0 beta

Win7 64bit


之前用手机的延时摄影软件拍过一段连续命名的图片,所以就想到使用这些图片来测试OpenCV的用法。


图片地址:



生成的视频:



大概方法:

1.新建一个QT Widget工程 OpenCV_Lapse_Test

2.在 *.pro文件里添加

INCLUDEPATH+=E:/OpenCV/necessary_file/include/opencv \
             E:/OpenCV/necessary_file/include/opencv2 \
             E:/OpenCV/necessary_file/include
LIBS += -L E:/OpenCV/necessary_file/lib/libopencv_*.a


3.头文件 mainwindow.h里添加上

#include "cv.h"
#include "core/core.hpp"
#include "cxcore.h"
#include "highgui/highgui.hpp"
#include "highgui.h"
#include "videoio/videoio_c.h"

4.在源文件 mainwindow.cpp 里添加主要函数:

void MainWindow::startTransfer()
{
    qDebug()<<"MainWindow::startTransfer";
    qint32 n_isColor = 1;
    double d_fps = 26; //要生成的视频的fps
    int n_imgW = 300; //要生成的视频的宽
    int n_imgH = 720;//要生成的视频的高
    QString strFileName = "video_show.avi"//要生成的视频的名字
    int n_startFrame = 1; //使用到的图片的起始索引
    int n_endFrame = 72;//使用到的图片的最终索引
    int n_frameNum = n_endFrame - n_startFrame;//要生成的视频的fps
    int n_curFrame = n_startFrame;
    QString strCommonName = fileCommonFlag;
    QString strPreFix = "D:/AboutMyself/OpenCV/images/2015.02.16_18.04.36/";//  E:/Qt/image/bg/1d60857569.jpg
    QString strExt = ".jpg";
    QString pictureName;
    IplImage *pImgTemp = cvLoadImage("D:/AboutMyself/OpenCV/images/2015.02.16_18.04.36/Proj3_img00000001.jpg", n_isColor);
    if(!pImgTemp)
    {
        qDebug()<<"pImgTemp error !";
        return;
    }
    n_imgW = pImgTemp->width;
    n_imgH = pImgTemp->height;
    CvSize imageSize = cvSize(n_imgW, n_imgH);
    CvVideoWriter *pWriter = NULL;
    //CV_FOURCC('I', 'Y', 'U', 'V'),
    /*
CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec
CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
*/
    //CV_FOURCC('P', 'I', 'M', '1') - error
    //CV_FOURCC('M', 'J', 'P', 'G') - error
    //CV_FOURCC('M', 'P', '4', '2') - error
    //CV_FOURCC('D', 'I', 'V', '3') - error
    //CV_FOURCC('D', 'I', 'V', 'X') - error
    //CV_FOURCC('U', '2', '6', '3') - error
    //CV_FOURCC('I', '2', '6', '3') - error
    //CV_FOURCC('F', 'L', 'V', '1') - error
    pWriter=  cvCreateVideoWriter(strFileName.toStdString().c_str(),
                                  -1, /*** 注意 ***/
                                  d_fps,
                                  imageSize,
                                  n_isColor);
    IplImage *pImg = 0;
    if(!pWriter)
    {
        qDebug()<<"pWriter error !";
        return;
    }
    m_btnStart->setEnabled(false);
    while (n_curFrame <= n_endFrame)
    {
              //拼接出要转换的图片的全称(包含路径)
        pictureName = QString("%1%2%3%4").arg(strPreFix).arg(strCommonName).arg(QString::number(n_curFrame), 8, '0').arg(strExt);
        qDebug()<<"pictureName:"<<pictureName;
        pImg = cvLoadImage(pictureName.toStdString().c_str(), n_isColor);
        if(!pImg)
        {
            qDebug()<<"pImg error !";
            m_btnStart->setEnabled(true);
            return;
        }
        cvWaitKey(200);
        int result = cvWriteFrame(pWriter, pImg);
        cvWaitKey(200);
        qDebug()<<"write frame" << n_curFrame << result;
        n_curFrame++;
        cvReleaseImage(&pImg);
        emit processChange(static_cast<int>(n_curFrame/n_frameNum * 100));
    }
    cvReleaseVideoWriter(&pWriter);//释放
    qDebug()<<"write complete";
    m_btnStart->setEnabled(true);
}

5.以上代码就基本可以了。


注意代码里生成视频使用的编码器标注

/*** 注意 ***/
,我使用的是 -1  ,使用-1就是说在点击开始转换的时候,会弹出一个弹框让你选择你需要的编码器。

之所以这样做是因为如果我不写-1,我选择什么编码器都会提示错误。这个错误我还没解决,解决后会更新这篇博文。

0 0
原创粉丝点击