• C++读取视频帧保存成图片


      1 #include<opencv2opencv.hpp>
      2 #include <iostream>
      3 #include <stdio.h>
      4 #include<fstream> 
      5 
      6 using namespace std;
      7 using namespace cv;
      8 
      9 
     10 
     11 int main()
     12 {
     13     //打开视频文件:其实就是建立一个VideoCapture结构  
     14     VideoCapture capture("D:/MyData/zhaohz4/Desktop/Nansha_video/2.mp4");   
     15     //检测是否正常打开:成功打开时,isOpened返回ture  
     16     if (!capture.isOpened())
     17         cout << "fail toopen!" << endl;
     18 
     19     //获取整个帧数  
     20     long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
     21     cout << "整个视频共" << totalFrameNumber << "" << endl;
     22     //设置开始帧()  
     23     long frameToStart = 1;
     24     capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);
     25     cout << "从第" << frameToStart << "帧开始读" << endl;
     26 
     27 
     28     //设置结束帧  
     29     int frameToStop = 4000;
     30 
     31     if (frameToStop < frameToStart)
     32     {
     33         cout << "结束帧小于开始帧,程序错误,即将退出!" << endl;
     34         return -1;
     35     }
     36     else
     37     {
     38         cout << "结束帧为:第" << frameToStop << "" << endl;
     39     }
     40 
     41     //获取帧率  
     42     double rate = capture.get(CV_CAP_PROP_FPS);
     43     cout << "帧率为:" << rate << endl;
     44     //定义一个用来控制读取视频循环结束的变量  
     45     bool stop = false;
     46 
     47     //承载每一帧的图像  
     48     Mat frame;
     49 
     50     //显示每一帧的窗口  
     51     namedWindow("Extractedframe");
     52 
     53     //两帧间的间隔时间:  
     54     //int delay = 1000/rate;  
     55     double delay = 2000 / rate;     //??
     56 
     57 
     58     //利用while循环读取帧  
     59     //currentFrame是在循环体中控制读取到指定的帧后循环结束的变量  
     60     long currentFrame = frameToStart;
     61 
     62 
     63     //滤波器的核  
     64     int kernel_size = 3;
     65     Mat kernel = Mat::ones(kernel_size, kernel_size, CV_32F) / (float)(kernel_size*kernel_size);
     66 
     67     while (!stop)
     68     {
     69         //读取下一帧  
     70         if (!capture.read(frame))
     71         {
     72             cout << "读取视频失败" << endl;
     73             return -1;
     74         }
     75         if (currentFrame % 3 == 0)    //每三帧保存一帧
     76         {
     77             cout << "正在读取第" << currentFrame << "" << endl;
     78             imshow("Extractedframe", frame);
     79 
     80             cout << "正在写第" << currentFrame << "" << endl;
     81             stringstream str;
     82             str << "2-"<<currentFrame << ".jpg";     //保存格式
     83             cout << str.str() << endl;
     84             imwrite(str.str(), frame);
     85         }
     86 
     87         //waitKey(intdelay=0)当delay≤ 0时会永远等待;当delay>0时会等待delay毫秒  
     88         //当时间结束前没有按键按下时,返回值为-1;否则返回按键  
     89         //int c = waitKey(delay);
     90         int c = waitKey(1000);
     91         //按下ESC或者到达指定的结束帧后退出读取视频  
     92         if ((char)c == 27 || currentFrame > frameToStop)
     93         {
     94             stop = true;
     95         }
     96         //按下按键后会停留在当前帧,等待下一次按键  
     97         if (c >= 0)
     98         {
     99             waitKey(0);
    100         }
    101         currentFrame++;
    102 
    103     }
    104     //关闭视频文件  
    105     capture.release();
    106     waitKey(0);
    107     return 0;
    108 }
  • 相关阅读:
    #ifndef/#define/#endif使用详解
    快速排序
    一分钟看懂Docker的网络模式和跨主机通信
    Docker:网络模式详解
    Docker中使用Tomcat并部署war工程
    Docker学习笔记--Docker 启动nginx实例挂载目录权限不够(转)
    Centos 7 如何卸载docker
    Centos-7修改yum源为国内的yum源
    centOS 7镜像文件下载
    Python 垃圾回收机制(转)
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725232.html
Copyright © 2020-2023  润新知