QT+opencv视频采集和存储Demo

本次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
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值