zoukankan      html  css  js  c++  java
  • 1.6 opencv视频操作基础

    利用opencv中的VideoCapture类,来对视频进行读取显示,以及调用摄像头。

    VideoCapture是opencv 2.X中新增的一个类,对应于之前C语言版本的CvCapture结构体。它提供了从摄像机或视频文件捕获视频的C++接口,作用是从视频文件或从摄像头捕获视频并显示出来。

    1、读取并播放视频

    通过对VideoCapture类的分析,可以发现利用它读入视频的方法一般有如下两种:

    1)先实例化再初始化

    VideoCapture capture;

    capture.open("1.avi");//1.avi为工程路径下的视频文件

    2)在实例化的同时进行初始化

    VideoCapture capture("1.avi");

    视频读入到VideoCapture类对象之后,紧接着可以用一个循环将每一帧都显示出来,相关代码如下:

    //循环显示每一帧
    while(1)
    {
        Mat frame;//定义一个Mat变量,用于存储每一帧的图像
        capture>>frame;//读取当前帧
        imshow("读取视频",frame);//显示当前帧
        waitkey(30);//延时30ms
    }

    上面代码中,首先定义一个Mat变量,用于存储每一帧的图像,接着读取当前帧到Mat变量中,然后调用imshow显示当前的这一帧图像,并用waitkey延时30毫秒,开始下一次循环。
    视频载入示例程序

    #include<opencv2/opencv.hpp>
    using namespace cv;//包含cv命名空间
    int main()
    {
        //1读图视频
        VideoCapture capture("1.avi");
        //2循环显示每一帧
        while (1)
        {
            Mat frame;//定义一个Mat变量,用于存储每一帧的图像
            capture >> frame;//读取当前帧
            imshow("读取视频",frame);//显示当前帧
            waitKey(30);//延时30ms
        }
        return (0);
    }

    2、调用摄像头采集图像
    要调用摄像头进行视频采集的话,将代码VideoCapture capture("1.avi")中的"1.avi"换为0即可;表示调用摄像头而不是从文件中读取。对应于上文讲到的两种写法,即有

    1)先实例化再初始化

    VideoCapture capture;

    capture.open(0);

    2)在实例化的同时进行初始化

    VideoCapture capture(0);

    代码:

    #include<opencv2/opencv.hpp>
    using namespace cv;//包含cv命名空间
    int main()
    {
        //1从摄像头读入视频
        VideoCapture capture(0);
        //2循环显示每一帧
        while (1)
        {
            Mat frame;//定义一个Mat变量,用于存储每一帧的图像
            capture >> frame;//读取当前帧
            imshow("读取视频",frame);//显示当前帧
            waitKey(30);//延时30ms
        }
        return (0);
    }
    View Code

    下面通过上面的摄像头程序来调用canny边缘检测,得到canny边缘检测并高斯模糊后的摄像头采集视频,

    #include<opencv2/opencv.hpp>
    using namespace cv;//包含cv命名空间
    int main()
    {
        //1从摄像头读入视频
        VideoCapture capture(0);
        Mat edges;
        //2循环显示每一帧
        while (1)
        {
            //1读入图像
            Mat frame;//定义一个Mat变量,用于存储每一帧的图像
            capture >> frame;//读取当前帧
            //2将源图像转换为灰度图像
            cvtColor(frame,edges,CV_BGR2GRAY);//转化BGR彩色图为灰度图
            //3使用3*3内核来降噪(2*3+1=7)
            blur(edges,edges,Size(7,7));//进行模糊
            //4进行canny边缘检测并显示
            Canny(edges,edges,0,30,3);
            imshow("被canny后的视频",edges);//显示经过处理后的当前帧
            if(waitKey(30)>=0)
                break;//延时30ms
        }
        return (0);
    }
    View Code
  • 相关阅读:
    满20年程序员生涯-与大家分享最近7年的快速成长经历(上海市青浦区快递行业战斗7年奋斗史)
    格局 逐阶而上
    基础才是重中之重~BouncyCastle实现的DES3加密~java通用
    jenkins~Publish Over SSH实现分布式部署
    maven~为MANIFEST.MF文件添加内容
    maven~多个plugin相同phase的执行顺序
    java~jar防止反编译
    个人博客的简单通告
    SQL Server中datetimeset转换datetime类型问题浅析
    MySQL如何计算统计redo log大小
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6641498.html
Copyright © 2011-2022 走看看