zoukankan      html  css  js  c++  java
  • 4、【opencv入门】读取视频、读取摄像头

    一、介绍

    视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的。1秒24帧基本就能流畅的读取视频了。 
    1、读取视频有两种方法:

    1)   VideoCapture cap; 
            cap.open(“1.avi”); 
    (2)   VideoCapture cap(“1.avi”);    

    2、循环显示每一帧: 

    1 while(1) 
    2 { 
    3     Mat frame; //定义Mat变量,用来存储每一帧 
    4     cap>>frame; //读取当前帧方法一 
    5     //cap.read(frame); //读取当前帧方法二 
    6     imshow(“视频显示”, frame); //显示一帧画面 
    7     waitKey(30); //延时30ms 
    8 }

    二、读取视频

    【示例】

     1 //读取视频
     2 #include<opencv2/core/core.hpp>
     3 #include<opencv2/imgproc/imgproc.hpp>
     4 #include<opencv2/highgui/highgui.hpp>
     5 #include<iostream>
     6 
     7 using namespace std;
     8 using namespace cv;
     9 
    10 int main(){
    11     VideoCapture cap;
    12     cap.open("../../1.mp4"); //打开视频,以上两句等价于VideoCapture cap("E://2.avi");
    13 
    14     if(!cap.isOpened())//如果视频不能正常打开则返回
    15         return -1;
    16 
    17     int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);//帧宽度
    18     int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);//帧高度
    19     int frameRate = cap.get(CV_CAP_PROP_FPS);//帧率 × frames/s
    20     int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT);//总帧数
    21 
    22     //获取视频的相关参数
    23     cout << "视频的宽度:" << width << endl;
    24     cout << "视频的高度:" << height << endl;
    25     cout << "视频的总帧数:" << totalFrames << endl;
    26     cout << "帧率:" << frameRate << endl;
    27 
    28     Mat frame;
    29     while(1)
    30     {
    31         cap>>frame;//等价于cap.read(frame);
    32         if(frame.empty())//如果某帧为空则退出循环
    33             break;
    34         imshow("video", frame);
    35         waitKey(20);//每帧延时20毫秒
    36     }
    37     cap.release();//释放资源
    38 
    39     return 0;
    40 }

    三、读取摄像头

    读取摄像头和读取视频大同小异,主要是这句代码有些许不同。 

    1 VideoCapture cap; 
    2 cap.open(0); 

    读取视频时可以传入视频路径,而读取摄像头传入的是index索引号。

    注: 
      1)如果默认笔记本/台式机只有一个USB摄像头,Index=0; 如果有2个,一般Index为0和1,根据具体情况区分,摄像头接入和断开会改变Index值 
      2)如果接入2个以上,但只想用指定的一个,可以在设备管理器中禁用其他,同时Index设置为0

      3)因为开启摄像头后一直在进行读取,所以需要用waitKey()返回值判断退出预览 

    1 imshow(“video”, frame); 
    2 if(waitKey(30)>0)//无按键按下返回-1,按键按下时退出 
    3     break; 

    也可以指定按键退出: 

    1 if(waitKey(30)==27) //Esc键退出,ESC的ASCLL码为27 
    2     break;

    【示例】

     1 //读取摄像头
     2 #include <opencv2/core/core.hpp>
     3 #include <opencv2/highgui/highgui.hpp>
     4 #include <opencv2/imgproc/imgproc.hpp>
     5 #include <iostream>
     6 
     7 using namespace std;
     8 using namespace cv;
     9 
    10 int main(){
    11     VideoCapture cap;
    12     cap.open(0); //打开摄像头
    13 
    14     if(!cap.isOpened())
    15         return -1;
    16 
    17     Mat frame;
    18     while(1)
    19     {
    20         cap>>frame;//等价于cap.read(frame);
    21         //Canny(frame, frame, 30, 100);//canny边缘检测,去掉这一行就是纯粹的读取摄像头了
    22         cvtColor(frame, frame, CV_BGR2HSV);//BGR空间转为HSV颜色空间,注意,两者不能同时对同一张图片(在此为frame)进行处理,否则报错
    23         if(frame.empty())
    24             break;
    25         imshow("video", frame);
    26         if(waitKey(20)>0)//按下任意键退出摄像头  因电脑环境而异,有的电脑可能会出现一闪而过的情况
    27             break;
    28     }
    29     cap.release();//释放所有资源
    30     destroyAllWindows();//关闭所有窗口
    31     
    32     return 0;
    33 }

    四、写入视频

    1、介绍

    (1)VideoWriter: OpenCV提供VideoWriter类写视频文件,类的构造函数可以指定文件名、播放帧率、帧尺寸、是否创建彩色视频。

    1 CV_WRAP VideoWrite();
    2 CV_WRAP VideoWrite(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);

    (2)两种写入帧方法:

    1 writer.write(frame); 
    2 writer << frame;

    (3)注意事项: 
      1)写入视频前需安装对应的编解码器 
      2)生成视频是否支持彩色应与构造函数设置一致 
      3)生成视频尺寸需与读取视频尺寸一致

    【示例】

     1 //写入视频
     2 #include <opencv2/core/core.hpp>
     3 #include <opencv2/highgui/highgui.hpp>
     4 #include <opencv2/imgproc/imgproc.hpp>
     5 #include<iostream>
     6 
     7 using namespace cv;
     8 using namespace std;
     9 
    10 int main(){
    11     VideoCapture cap;
    12     cap.open("../../1.avi");
    13     Size size0=Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
    14     VideoWriter writer("../../out.avi",-1,cap.get(CV_CAP_PROP_FPS),size0,false);
    15 
    16     if(!cap.isOpened())
    17         return -1;
    18 
    19     Mat frame;
    20     while(1)
    21     {
    22         cap>>frame;
    23         Canny(frame,frame,30,100);
    24         if(frame.empty())
    25             break;
    26         writer<<frame;//等同于writer.write(frame);
    27         imshow("video", frame);
    28         if(waitKey(10)>0)
    29             break;
    30     }
    31     cout<<"write end!";
    32     cap.release();
    33     //destroyAllWindows();
    34 
    35     return 0;
    36 }
  • 相关阅读:
    linux---集群架构初探(29) zabbix安装--5.0LTS+nginx+mysql
    linux---集群架构初探(28)常用监控命令
    合并两个有序数组
    从源码了解HashMap和ConcurrentHashMap的基本实现(下)
    从源码了解HashMap和ConcurrentHashMap的基本实现(上)
    从源码了解ArrayList和LinkedList
    从源码了解String,StringBuffer和StringBuilder
    java基本数据类型
    jsp 中 include指令 用法, <%@ include file="..."%> 和 <jsp:include page="..." flush="true" />的区别?
    AWS SAA_C01 考试分享。
  • 原文地址:https://www.cnblogs.com/Long-w/p/9661179.html
Copyright © 2011-2022 走看看