1 // 2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #pragma once 6 7 8 #include "IFrameReader.hpp" 9 #include <opencv2/opencv.hpp> 10 11 namespace common 12 { 13 14 class CvVideoFrameReader : 15 public IFrameReader<cv::Mat> 16 { 17 public: 18 /** 19 * @brief Default constructor. 20 * 21 * Underlying open cv video capture object will be instantiated. 22 */ 23 CvVideoFrameReader() = default; 24 25 ~CvVideoFrameReader() override = default; 26 27 /** 28 *@brief Initialises reader to capture frames from video file. 29 * 30 * @param source path to the video file or image sequence. 31 * 32 * @throws std::runtime_error if init failed 33 */ 34 void Init(const std::string& source); 35 36 std::shared_ptr <cv::Mat> ReadFrame() override; 37 38 bool IsExhausted(const std::shared_ptr <cv::Mat>& frame) const override; 39 40 /** 41 * Returns effective video frame width supported by the source/set by the user. 42 * Must be called after Init method. 43 * @return frame width 44 */ 45 int GetSourceWidth() const; 46 47 /** 48 * Returns effective video frame height supported by the source/set by the user. 49 * Must be called after Init method. 50 * @return frame height 51 */ 52 int GetSourceHeight() const; 53 54 /** 55 * Returns effective fps value supported by the source/set by the user. 56 * @return fps value 57 */ 58 double GetSourceFps() const; 59 60 /** 61 * Will query OpenCV to convert images to RGB 62 * Copy is actually default behaviour, but the set function needs to be called 63 * in order to know whether OpenCV supports conversion from our source format. 64 * @return boolean, 65 * true: OpenCV returns RGB 66 * false: OpenCV returns the fourcc format from GetSourceEncoding 67 */ 68 bool ConvertToRGB(); 69 70 /** 71 * Returns 4-character code of codec. 72 * @return codec name 73 */ 74 std::string GetSourceEncoding() const; 75 76 /** 77 * Get the fourcc int from its string name. 78 * @return codec int 79 */ 80 int GetSourceEncodingInt() const; 81 82 int GetFrameCount() const; 83 84 private: 85 cv::VideoCapture m_capture; 86 87 void CheckIsOpen(const std::string& source); 88 }; 89 90 class CvVideoFrameReaderRgbWrapper : 91 public IFrameReader<cv::Mat> 92 { 93 public: 94 CvVideoFrameReaderRgbWrapper() = delete; 95 CvVideoFrameReaderRgbWrapper(const CvVideoFrameReaderRgbWrapper& o) = delete; 96 CvVideoFrameReaderRgbWrapper(CvVideoFrameReaderRgbWrapper&& o) = delete; 97 98 CvVideoFrameReaderRgbWrapper(std::unique_ptr<common::CvVideoFrameReader> reader); 99 100 std::shared_ptr<cv::Mat> ReadFrame() override; 101 102 bool IsExhausted(const std::shared_ptr<cv::Mat>& frame) const override; 103 104 private: 105 std::unique_ptr<common::CvVideoFrameReader> m_reader; 106 }; 107 108 }// namespace common