天天看點

OpenCV + CPP 系列(十五)相機 與 視訊

文章目錄

  • ​​一、簡單讀取​​
  • ​​二、視訊屬性​​

一、簡單讀取

頭檔案 ​

​quick_opencv.h​

​:聲明類與公共函數

#pragma once
#include <opencv2\opencv.hpp>
using namespace cv;

class QuickDemo {
public:
  ...
  void video_Demo(Mat& image);
};      

主函數調用該類的公共成員函數

#include <opencv2\opencv.hpp>
#include <quick_opencv.h>
#include <iostream>
using namespace cv;


int main(int argc, char** argv) {
  Mat src = imread("D:\\Desktop\\pandas.jpg");
  if (src.empty()) {
    printf("Could not load images...\n");
    return -1;
  }
  namedWindow("input", WINDOW_NORMAL);
  imshow("input", src);

  QuickDemo qk;

  ...
  //qk.polyline_drawing_Demo();
  qk.video_Demo(src);
  waitKey(0);
  destroyAllWindows();
  return 0;
}      

源檔案 ​

​quick_demo.cpp​

​:實作類與公共函數

void QuickDemo::video_Demo(Mat& image) {
  VideoCapture captrue("D\\balltest.mp4"); //打開視訊
  //VideoCapture captrue(0);         //打開相機
  Mat frame;
  while (true)
  {
    captrue.read(frame);
    if (frame.empty()) {
      break;
    }
    // TODO:各種處理
    imshow("frame", frame);
    int c = waitKey(10);
    if (c == 27) {
      break;
    }
  }
  captrue.release();
}      

二、視訊屬性

VideoWriter::VideoWriter(
const String & filename,   視訊檔案的路徑名稱 
int fourcc,        表示用于編碼視訊檔案的編碼器 
double fps,         幀率 
Size frameSize,       幀寬高 
bool isColor=true     灰階圖像或者是彩色圖像(僅僅在windows上支援) 
)
      
  • fourcc為 四個字元用來表示壓縮幀的codec 例如:

    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,則運作時會彈出一個編碼器選擇框.

void QuickDemo::video_Demo(Mat& image) {
  VideoCapture captrue("D:\\opencv-c++\\images\\balltest.mp4"); //打開視訊
  int frame_width = captrue.get(CAP_PROP_FRAME_WIDTH);     // 幀寬
  int frame_height = captrue.get(CAP_PROP_FRAME_HEIGHT);   // 幀高
  int count = captrue.get(CAP_PROP_FRAME_COUNT);           // 總幀數
  double fps = captrue.get(CAP_PROP_FPS);           // 幀率
  
  std::cout<< "frame_width=" << frame_width << std::endl;
  std::cout<< "frame_height=" << frame_height << std::endl;
  std::cout<< "Number of frames count=" << count << std::endl;
  std::cout<< "FPS=" << fps << std::endl;

  VideoWriter writer("D:\\Desktop\\test.mp4", captrue.get(CAP_PROP_FOURCC),fps,Size(frame_width,frame_height),true);
  Mat frame, hsv;
  while (true)
  {
    captrue.read(frame);
    if (frame.empty()) {
      break;
    }
    // TODO:各種處理
    cvtColor(frame, hsv, COLOR_BGR2HSV);
    imshow("hsv", hsv);
    
    writer.write(hsv);
    int c = waitKey(10);
    if (c == 27) {
      break;
    }
  }
  captrue.release();
  writer.release();
}