32#include <opencv2/core/core.hpp>
35#include <SimoxUtility/algorithm.h>
38#include <Image/ByteImage.h>
53 static const std::map<visionx::imrec::Format, visionx::imrec::RegistryEntry> registry = {
56 ".bmp (Bitmap image sequence)",
61 ".png (PNG image sequence, high compression, single-threaded)",
66 ".png (PNG image sequence, fast, single-threaded)",
71 ".png (PNG image sequence, high compression, multi-threaded)",
76 ".png (PNG image sequence, fast, multi-threaded)",
81 ".jpg (JPG image sequence)",
96 static const std::map<std::string, visionx::imrec::Format> registry_inv = []()
98 std::map<std::string, visionx::imrec::Format> m;
99 for (
const auto& [format, reg_entry] : ::registry)
101 m[reg_entry.id] = format;
102 m[reg_entry.hr_name] = format;
111 return ::registry.at(format).id;
117 return ::registry.at(format).hr_name;
123 if (::registry_inv.find(format_str) == ::registry_inv.end())
125 const std::string err =
"Unknown format str '" + format_str +
"' for imrec format.";
126 throw std::runtime_error{err.c_str()};
129 return ::registry_inv.at(format_str);
132std::vector<visionx::imrec::Format>
135 std::vector<Format> keys;
136 std::transform(::registry.begin(),
138 std::back_inserter(keys),
139 [](
const auto& e) {
return e.first; });
143std::map<visionx::imrec::Format, visionx::imrec::RegistryEntry>
167 const std::string pathstr = to_lower(path.string());
170 if (ends_with(pathstr,
"metadata.csv") or
171 (std::filesystem::is_directory(path) and std::filesystem::exists(path /
"metadata.csv")))
173 return std::make_shared<strats::ChunkedImageSequencePlaybackStrategy>(path);
177 const bool isImage = ends_with(pathstr,
".png") or ends_with(pathstr,
".jpg") or
178 ends_with(pathstr,
".jpeg") or ends_with(pathstr,
".bmp");
179 if (isImage or contains(pathstr,
"*") or std::filesystem::is_directory(path))
181 return std::make_shared<strats::ImageSequencePlaybackStrategy>(path);
185 if (ends_with(pathstr,
".avi") or ends_with(pathstr,
".mp4"))
187 return std::make_shared<strats::VideoPlaybackStrategy>(path);
195 const std::string& name,
199 const unsigned int png_high_quality = 9;
200 const unsigned int png_fast_quality = 1;
201 const unsigned int jpg_default_quality = 95;
202 const unsigned int png_thread_pool_size = std::thread::hardware_concurrency() / 2;
207 return std::make_shared<strats::BMPRecordingStrategy>(path, name);
209 return std::make_shared<strats::PNGRecordingStrategy>(path, name, png_high_quality);
211 return std::make_shared<strats::PNGRecordingStrategy>(path, name, png_fast_quality);
213 return std::make_shared<strats::PNGParallelRecordingStrategy>(
214 path, name, png_high_quality, png_thread_pool_size);
216 return std::make_shared<strats::PNGParallelRecordingStrategy>(
217 path, name, png_fast_quality, png_thread_pool_size);
219 return std::make_shared<strats::JPGRecordingStrategy>(path, name, jpg_default_quality);
221 return std::make_shared<strats::AVIRecordingStrategy>(path, name, fps);
223 return std::make_shared<strats::H264RecordingStrategy>(path, name, fps);
234 const std::string ext = to_lower(path.extension().string());
238 if (ext ==
".bmp" or ext ==
"")
242 else if (ext ==
".png")
246 else if (ext ==
".jpg" or ext ==
".jpeg")
250 else if (ext ==
".avi")
254 else if (ext ==
".mp4")
263 return newRecording(path.parent_path(), path.stem().string(), format, fps);
static void recordSnapshot(const cv::Mat &image, const std::filesystem::path &path)
bool isFormatDynamicFramerate(Format format)
const std::string & format2str(const Format format)
std::vector< Format > getFormats()
visionx::imrec::Recording newRecording(const std::filesystem::path &path, const std::string &name, const Format format, double fps)
std::map< Format, RegistryEntry > getFormatsMap()
void takeSnapshot(const CByteImage &image, const std::filesystem::path &filePath)
Takes a snapshot using the default recording method for snapshots.
Format str2format(const std::string &format_str)
const std::string & format2hrstr(const Format format)
visionx::imrec::Playback newPlayback(const std::filesystem::path &path)
Instantiates and returns a new playback strategy which is capable of replaying the file or collection...
Format
Supported recording Formats.
std::shared_ptr< visionx::imrec::AbstractPlaybackStrategy > Playback
Convenience alias for an instance of any playback strategy.
std::shared_ptr< AbstractRecordingStrategy > Recording
Convenience alias for any recording strategy.
bool isFormatLossless(Format format)