QT+opencv视频采集和存储Demo

来源:互联网 发布:四川广电网络 业务 编辑:程序博客网 时间:2024/05/01 21:13

本次bolg主要记录本人在做opencv+QT进行摄像头视频采集和存储实验时遇到的一些问题,并给出我的一些解决思路,希望能够帮助大家。

opencv视频采集是通过以下代码

VideoCapture video(0);
if(!video.isOpened())
{
cout << "Could not open video: "<< endl;
return -1;
}
视频保存是通过下述代码
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配置时要仔细确保编译是成功的,并且勾选正确。
下面给出源程序
#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();}
实验结果







0 0
原创粉丝点击