【opencv学习之十七】摄像头及视频操作VideoCapture

opencv操作摄像头和视频都需要用VideoCapture类;话不多说吧,内容都在代码和注释里(Qt+opencv3);

1、打开摄像头并修改保存

//1.打开摄像头
void VideoOpen()
{
    //下面的代码在mian函数里或用其他函数调用即可
    /*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
           open()参数为路径,读入视频文件*/
    VideoCapture cap(0); // 打开摄像头0
    if (!cap.isOpened())  // 异常处理
    {
        QMessageBox mesg;
        mesg.about(NULL,"提示","摄像头打开失败");
        waitKey(1000);
    }
    double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);  //帧宽度
    double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
    double frameRate = cap.get(CV_CAP_PROP_FPS);  //帧率 x frames/s
    double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
    //输出视频相关参数信息
    qDebug()<<"视频宽度="<<width;
    qDebug()<<"视频高度="<<height;
    qDebug()<<"视频总帧数="<<totalFrames;
    qDebug()<<"帧率="<<frameRate;
    Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
    VideoWriter writer("D:\\opecvVIdeo.avi", //文件名
                       -1, //编解码器,写入视频前需安装对应的编解码器。这里填-1,不指定编解码方式,程序运行时会跳出窗口让我们选择
                       cap.get(CV_CAP_PROP_FPS),//播放帧率
                       size0,//帧尺寸,生成视频尺寸需与读取视频尺寸一致,若不一致,则写入的视频会出错。
                       false);/*是否创建彩色视频,生成视频是否支持彩色应与构造函数设置一致
                                  因为后面进行candy检测,每一帧都变成了黑白二值图像,所以这里应填false
                                  如果填true,则写入的视频会出错  */
    

    while (1)
    {
        Mat frame;
        bool bSuccess = cap.read(frame); // 获取一帧
        if (!bSuccess) //异常处理
        {
            QMessageBox mesg;
            mesg.about(NULL,"提示","Cannot read a frame from video stream");
            break;
        }
        cvtColor(frame, frame, CV_BGR2GRAY );//Canny边缘检测需要灰度图像
        Canny(frame, frame, 50, 100); //Canny 边缘检测

        writer<<frame;  //写入帧方法一

        imshow("MyVideo", frame); //显示获取到的视频帧
        if (waitKey(30) == 27) //按键退出
        {
            QMessageBox mesg;
            mesg.about(NULL,"信息","退出摄像");
            break;
        }
    }
    waitKey(10);
    cap.release();
}
效果如下:

2.读取视频文件并修改:

//2.读取并修改视频文件
void AVIopen()
{
    //    VideoCapture cap("http:/.avi");//也可以是网络视频,不过很少网站时avi格式的
    //    VideoCapture cap;        //读取视频方法二
    //    cap.open("E:\\2.avi");
    //下面的代码在mian函数里或用其他函数调用即可,我是加了按钮调用;
    /*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
           open()参数为路径,读入视频文件*/
    VideoCapture cap("D:\\1.avi"); // 打开摄像头0
    if (!cap.isOpened())  // 异常处理
    {
        QMessageBox mesg;
        mesg.about(NULL,"提示","摄像头打开失败");
        waitKey(1000);
    }
    /创建一个视频格式并写入
    //VideoCapture的get方法返回指定视频类的相关参数信息
    double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);  //帧宽度
    double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
    double frameRate = cap.get(CV_CAP_PROP_FPS);  //帧率 x frames/s
    double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
    //输出视频相关参数信息
    qDebug()<<"视频宽度="<<width;
    qDebug()<<"视频高度="<<height;
    qDebug()<<"视频总帧数="<<totalFrames;
    qDebug()<<"帧率="<<frameRate;
    Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
    //VideoWriter类的构造函数
    //VideoWriter writer("E:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, size0, true);
    VideoWriter writer("D:\\out.avi", //文件名
                       -1, //编解码器,写入视频前需安装对应的编解码器。这里填-1,不指定编解码方式,程序运行时会跳出窗口让我们选择
                       cap.get(CV_CAP_PROP_FPS),//播放帧率
                       size0,//帧尺寸,生成视频尺寸需与读取视频尺寸一致,若不一致,则写入的视频会出错。
                       false);/*是否创建彩色视频,生成视频是否支持彩色应与构造函数设置一致
                                  因为后面进行candy检测,每一帧都变成了黑白二值图像,所以这里应填false
                                  如果填true,则写入的视频会出错  */
    
    while (1)
    {
        Mat frame;
        bool bSuccess = cap.read(frame); // 获取一帧
        if (!bSuccess) //异常处理
        {
            QMessageBox mesg;
            mesg.about(NULL,"提示","视频结束");
            break;
        }
        cvtColor(frame, frame, CV_BGR2GRAY );//Canny边缘检测需要灰度图像
        Canny(frame, frame, 50, 100); //Canny 边缘检测
        imshow("MyVideo", frame); //显示获取到的视频帧

        //
        writer<<frame;  //写入帧方法一
        //writer.write(frame); //写入帧方法二
        /

        if (waitKey(30) == 27) //按键退出
        {
            QMessageBox mesg;
            mesg.about(NULL,"信息","退出摄像");
            break;
        }
    }
    waitKey(10);
    cap.release();
}
效果如下,左边是opencv读取,右边原图:



3.视频分解,将avi视频每一帧都单独保存为一张图片:

void AVIseparate()//3.视频文件分解
{
    Mat frame;
    char outfile[50];
    VideoCapture cap("D:\\1.avi"); //创建VideoCapture类读视频
    if(!cap.isOpened())         //判断是否成功打开视频
        return;
    int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT); //VideoCapture类的get方法获取视频总帧数
    for(int i = 1; i<=totalFrame; i++)     //for循环totalFrame次
    {
        cap>>frame;                 //读取每一帧
        if(frame.empty())           //判断帧异常
            break;
        sprintf(outfile, "D:\\allframe\\%d.bmp", i); //利用sprintf格式化图片名
        imwrite(outfile, frame);    //保存每一帧到目标地址
        imshow("video", frame);
        waitKey(15);
    }
    cap.release();
    destroyAllWindows();
    QMessageBox mesg;
    mesg.about(NULL,"信息","视频分解完毕");
}
效果如下:

4.将有序图片合成视频,注意图片大小和类型要一样,我合成的就是上面分解的视频:

void AVIcombine()//4.有序图片合成
{
    //创建VideoWriter类写视频到本地,要确定好size,不然不能够合成
    VideoWriter writer("D:\\out2.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, Size(640, 480), true);
    //VideoCapture cap;
    char filename[50];
    Mat frame;
    for(int i = 1; i<200; i++)
    {
        sprintf(filename, "D:\\allframe\\%d.bmp", i);
        frame = imread(filename);   //读图片的方法(一句就行)
        if(frame.empty())     //检测帧异常
            break;
        writer<<frame;        //写入帧
    }
    //    qDebug()<<"视频合成完毕"<<endl;
    destroyAllWindows();
    QMessageBox mesg;
    mesg.about(NULL,"信息","视频合成完毕");
}
然后出现如下文件:




  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值