NVIDIA DeepStream SDK API Reference

9.2 Release
sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2021-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef OCV_TRACKING_MODEXEC_FRAMEOUTPUT_HPP_
19 #define OCV_TRACKING_MODEXEC_FRAMEOUTPUT_HPP_
20 
21 #include <opencv2/core.hpp>
22 #include <opencv2/imgproc.hpp>
23 #include <opencv2/videoio.hpp>
24 #include <opencv2/videoio/videoio_c.h>
25 
26 #include <unordered_map>
27 
30 {
31 public:
34  {
35  mOutputVideo = nullptr;
36  mIsVideoOutputEnabled = false;
37  }
38 
40  virtual ~FrameOutput()
41  {
42  if(mOutputVideo != nullptr)
43  {
44  if(mOutputVideo->isOpened())
45  {
46  mOutputVideo->release();
47  }
48  }
49  }
50 
55  bool isImageOutputEnabled(const uint outputDirectoryKey = 0)
56  {
57  if(mIsImageOutputEnabled.find(outputDirectoryKey) != mIsImageOutputEnabled.end())
58  {
59  return mIsImageOutputEnabled.at(outputDirectoryKey);
60  }
61  else
62  {
63  return false;
64  }
65  }
66 
69 
79  const std::string outputVideoDirectory, const std::string outputVideoName,
80  cv::Size videoSize, const double fps = 5.f
81  )
82  {
83  std::string mkdirCmd = std::string("mkdir -p " + outputVideoDirectory);
84  if(!system(mkdirCmd.c_str()));
85 
86  mkdirCmd = std::string("rm -f " + outputVideoDirectory + "/*.avi");
87  if(!system(mkdirCmd.c_str()));
88 
89  int codecType = cv::VideoWriter::fourcc('X','V','I','D');
90  std::string fullOutputVideoFilename = outputVideoDirectory + "/" + outputVideoName + ".avi";
91 
92  if(mOutputVideo != nullptr)
93  delete mOutputVideo;
94 
95  mOutputVideo = new cv::VideoWriter(fullOutputVideoFilename, codecType, fps, videoSize, true);
96 
97  if(!mOutputVideo->isOpened())
98  {
99  std::cout << "[ERROR] failed to open output video: " << fullOutputVideoFilename << std::endl;
100  mIsVideoOutputEnabled = false;
101  return false;
102  }
103  else
104  {
105  mIsVideoOutputEnabled = true;
106  return true;
107  }
108  }
109 
117  const std::string outputImageDirectory, const int compressionLevel = 95, const uint outputDirectoryKey = 0
118  )
119  {
120  assert(outputImageDirectory.size() > 0);
121 
122  std::string mkdirCmd = std::string("mkdir -p " + outputImageDirectory);
123  if(!system(mkdirCmd.c_str()));
124 
126  compression_params.clear();
127 
128  compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
129  compression_params.push_back(compressionLevel);
130 
131  compression_params.push_back(cv::IMWRITE_JPEG_OPTIMIZE);
132  compression_params.push_back(1);
133 
134  mOutputImageDirectory[outputDirectoryKey] = outputImageDirectory;
135  mIsImageOutputEnabled[outputDirectoryKey] = true;
136  }
137 
142  void writeVideoOutput(const cv::Mat &img)
143  {
144  assert(mIsVideoOutputEnabled);
145  assert(mOutputVideo != nullptr);
146 
147  *mOutputVideo << img;
148  }
149 
158  const cv::Mat &img, const std::string imgFilename,
159  const uint outputDirectoryKey = 0, const std::string subFolderName = ""
160  )
161  {
162  std::stringstream fullOutFilePath;
163 
164  fullOutFilePath << mOutputImageDirectory[outputDirectoryKey];
165 
166  if(subFolderName.size() > 0)
167  {
168  fullOutFilePath << "/" << subFolderName;
169  }
170 
172  std::unique_ptr<FILE, decltype(&pclose)> pipe(
173  popen(std::string("mkdir -p " + fullOutFilePath.str()).c_str(), "r"), pclose
174  );
175  if (!pipe) {
176  throw std::runtime_error("popen() failed!");
177  }
178 
179  fullOutFilePath << "/" << imgFilename << ".jpg";
180 
181  if(isImageOutputEnabled(outputDirectoryKey) == true && mOutputImageDirectory[outputDirectoryKey].size() > 0)
182  {
183  cv::imwrite(fullOutFilePath.str(), img, compression_params);
184  }
185  else
186  {
187  std::string message = "mOutputImageDirectory[" + std::to_string(outputDirectoryKey) + "] doesn't exist !!";
188  fprintf(stdout, "~~ CLOG[%s, %s() @line %d]: %s\n", __FILE__, __func__, __LINE__, message.c_str());
189  }
190  }
191 
192 protected:
193  cv::VideoWriter *mOutputVideo;
195  std::vector<int> compression_params;
196  std::unordered_map<uint, std::string> mOutputImageDirectory;
197  std::unordered_map<uint, bool> mIsImageOutputEnabled;
198 };
199 
200 #endif // OCV_TRACKING_MODEXEC_FRAMEOUTPUT_HPP_
FrameOutput::isVideoOutputEnabled
bool isVideoOutputEnabled()
Report whether video output is enabled.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:68
nostd::unique_ptr
std::unique_ptr< _Types... > unique_ptr
Definition: includes/opentelemetry/std/unique_ptr.h:19
FrameOutput::isImageOutputEnabled
bool isImageOutputEnabled(const uint outputDirectoryKey=0)
Report whether image output is enabled for a directory key.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:55
FrameOutput::mIsVideoOutputEnabled
bool mIsVideoOutputEnabled
Indicates whether video output is enabled.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:194
uint
unsigned int uint
Definition: sources/libs/nvmultiobjecttracker/include/modules/cuDCFv2/helper_math.h:25
FrameOutput::enableVideoOutput
bool enableVideoOutput(const std::string outputVideoDirectory, const std::string outputVideoName, cv::Size videoSize, const double fps=5.f)
Create an AVI writer and enable video output.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:78
FrameOutput::writeVideoOutput
void writeVideoOutput(const cv::Mat &img)
Append an image to the output video.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:142
FrameOutput::enableImageOutput
void enableImageOutput(const std::string outputImageDirectory, const int compressionLevel=95, const uint outputDirectoryKey=0)
Configure a keyed directory for JPEG image output.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:116
FrameOutput::~FrameOutput
virtual ~FrameOutput()
Release the video writer and its output stream.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:40
FrameOutput::FrameOutput
FrameOutput()
Initialize output state with video output disabled.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:33
pydeepstreamdoc::tensor::TensorDoc::size
constexpr const char * size
Definition: service-maker/sources/python/src/bindings/docstrings/tensordoc.h:46
FrameOutput
Writes tracker visualization frames to image files or a video stream.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:29
FrameOutput::writeImageOutput
void writeImageOutput(const cv::Mat &img, const std::string imgFilename, const uint outputDirectoryKey=0, const std::string subFolderName="")
Write an image to a keyed output directory.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:157
FrameOutput::mOutputVideo
cv::VideoWriter * mOutputVideo
Video writer used when video output is enabled.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:193
FrameOutput::mIsImageOutputEnabled
std::unordered_map< uint, bool > mIsImageOutputEnabled
Image-output enabled state for each directory key.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:197
FrameOutput::compression_params
std::vector< int > compression_params
OpenCV image-encoding parameters.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:195
FrameOutput::mOutputImageDirectory
std::unordered_map< uint, std::string > mOutputImageDirectory
Image output directories keyed by caller-defined values.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:196