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);
}
注意代码里生成视频使用的编码器标注
/*** 注意 ***/
,我使用的是 -1 ,使用-1就是说在点击开始转换的时候,会弹出一个弹框让你选择你需要的编码器。
之所以这样做是因为如果我不写-1,我选择什么编码器都会提示错误。这个错误我还没解决,解决后会更新这篇博文。