本次bolg主要记录本人在做opencv+QT进行摄像头视频采集和存储实验时遇到的一些问题,并给出我的一些解决思路,希望能够帮助大家。
opencv视频采集是通过以下代码
VideoCapture video(0);
if(!video.isOpened())
{
cout << "Could not open video: "<< endl;
return -1;
}
视频保存是通过下述代码
videoRec.open("C:\\Users\\sz20150105\\Desktop\\VideoTest1.avi",CV_FOURCC('M','J','P','G'),30.0,Size(640,480));
上面红色加粗的是本次重点讲解地方。
网上出现有很多人出现保存视频失败,无法读取,或者视频文件为0字节等问题,很大可能是由于这里创建视频文件出现问题,关键问题就是视频编码格式设置错误。第二个参数主要设置如下:
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
视频保存是通过下述代码
VideoWriter videoRec;
videoRec.open("C:\\Users\\sz20150105\\Desktop\\VideoTest1.avi",CV_FOURCC('M','J','P','G'),30.0,Size(640,480));
上面红色加粗的是本次重点讲解地方。
网上出现有很多人出现保存视频失败,无法读取,或者视频文件为0字节等问题,很大可能是由于这里创建视频文件出现问题,关键问题就是视频编码格式设置错误。第二个参数主要设置如下:
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
然后本人在首次设置时,发现上诉参数设置全部无效,而将第二个参数设置为-1时,可以弹出windows编码设置,手动选定某一个编码后是可以成功保存视频的。经过查找资料以及实验本人发现,在vs2012+opencv2.4.13下上述参数是可以直接使用的,而在QT下却保存失败,经过分析,QT配置的opencv版本为2.4.9,且当初cmake进行源码编译采用的2.4.9;因此我怀疑是opencv版本过低或者是在cmake源码编译的时候没有勾上WIDTH_FFMPEG这个选项。
本人通过cmake重新编译opencv2.4.13版本就可以设定上诉几个参数进行保存。如果有读者遇到跟我一样的问题,请首先依次检查几个问题
1.确定是否是代码错误。
2.确定系统是否安装编码器ffmpeg,这个可以百度直接去官网下载。ffmpeg是一个强大的视频编解码开源库,也是一个专门研究的方向。
3.如果以上问题都确认后,果断怀疑opecv版本问题,建议大家使用2.4.13版本以上。
4.QT+opencv配置时要仔细确保编译是成功的,并且勾选正确。
下面给出源程序
1.确定是否是代码错误。
2.确定系统是否安装编码器ffmpeg,这个可以百度直接去官网下载。ffmpeg是一个强大的视频编解码开源库,也是一个专门研究的方向。
3.如果以上问题都确认后,果断怀疑opecv版本问题,建议大家使用2.4.13版本以上。
4.QT+opencv配置时要仔细确保编译是成功的,并且勾选正确。
下面给出源程序
#include <QApplication>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <QMessageBox>
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
VideoWriter videoRec;
VideoCapture video(0);
bool recflag=false;
MainWindow w;
w.show();
int temp=CV_FOURCC('M','J','P','G');
cout<<temp<<endl;
videoRec.open("C:\\Users\\sz20150105\\Desktop\\videoData\\VideoTest1.avi",CV_FOURCC('M','J','P','G'),30.0,Size(640,480));
if(!video.isOpened())
{
cout << "Could not open video: "<< endl;
return -1;
}
Mat frame;
recflag=true;
//writer("C:\\Users\\sz20150105\\Desktop\\VideoTest.avi",CV_FOURCC('M','J','P','G'),25.0,Size(640,480));
while(1)
{
video>>frame;
if(frame.empty())
{
cout<<"error"<<endl;
continue;
}
imshow("window",frame);
if(recflag)
videoRec.write(frame);
char c;
c=waitKey(33);
if(c==27||c=='q')
{
break;
}
if(c=='r')
{
recflag=false;
videoRec.release();
}
}
return a.exec();
}
实验结果