JeVois  1.22
JeVois Smart Embedded Machine Vision Toolkit
Share this page:
Loading...
Searching...
No Matches
Utils.H
Go to the documentation of this file.
1// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2//
3// JeVois Smart Embedded Machine Vision Toolkit - Copyright (C) 2016 by Laurent Itti, the University of Southern
4// California (USC), and iLab at USC. See http://iLab.usc.edu and http://jevois.org for information about this project.
5//
6// This file is part of the JeVois Smart Embedded Machine Vision Toolkit. This program is free software; you can
7// redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software
8// Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
9// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
10// License for more details. You should have received a copy of the GNU General Public License along with this program;
11// if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
12//
13// Contact information: Laurent Itti - 3641 Watt Way, HNB-07A - Los Angeles, CA 90089-2520 - USA.
14// Tel: +1 213 740 3527 - itti@pollux.usc.edu - http://iLab.usc.edu - http://jevois.org
15// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
16/*! \file */
17
18#pragma once
19
20#include <string>
21#include <vector>
22#include <type_traits> // for std::is_integral
23#include <sstream>
24#include <filesystem>
25
26//! Metadata V4L2 format used by Amlogic A311D camera ISP
27#define ISP_V4L2_PIX_FMT_META v4l2_fourcc( 'M', 'E', 'T', 'A' )
28
29//! JeVois-Pro zero-copy display of camera input frame (to be used as output mode in VideoMapping)
30/*! Note that the underlying mode is RGBA as used by MALI OpenGL */
31#define JEVOISPRO_FMT_GUI v4l2_fourcc( 'J', 'V', 'U', 'I' )
32
33namespace jevois
34{
35 /*! \defgroup utils Misc utilities
36
37 Miscellaneous utility and helper functions. */
38
39 /*! @{ */ // **********************************************************************
40
41 //! Convert a V4L2 four-cc code (V4L2_PIX_FMT_...) to a 4-char string
42 std::string fccstr(unsigned int fcc);
43
44 //! Convert cv::Mat::type() code to to a string (e.g., CV_8UC1, CV_32SC3, etc)
45 std::string cvtypestr(unsigned int cvtype);
46
47 //! Return the number of bytes per pixel for a given OpenCV pixel type
48 unsigned int cvBytesPerPix(unsigned int cvtype);
49
50 //! Convert a JeVois video format string to V4L2 four-cc code (V4L2_PIX_FMT_...)
51 /*! Throws a runtime_error if str is not one of: BAYER, YUYV, GREY, GRAY, MJPG, RGB565, BGR24 or NONE. */
52 unsigned int strfcc(std::string const & str);
53
54 //! Return the number of bytes per pixel for a given V4L2_PIX_FMT_...
55 unsigned int v4l2BytesPerPix(unsigned int fcc);
56
57 //! Return the image size in bytes for a given V4L2_PIX_FMT_..., width, height
58 unsigned int v4l2ImageSize(unsigned int fcc, unsigned int width, unsigned int height);
59
60 //! Return a value that corresponds to black for the given video format
61 /*! The returned value is appropriate to use as the color value for the image drawing functions in \ref image and may
62 not always be zero. */
63 unsigned int blackColor(unsigned int fcc);
64
65 //! Return a value that corresponds to white for the given video format
66 /*! The returned value is appropriate to use as the color value for the image drawing functions in \ref image. */
67 unsigned int whiteColor(unsigned int fcc);
68
69 //! Apply a letterbox resizing to fit an image into a window
70 /*! Modify given image dims (imw,imh) so that the image fits inside window dims (winw,winh) while being as large as
71 possible but without modifying the image's aspect ratio. If noalias is specified, the scaling factor will be
72 rounded down to the nearest integer to prevent aliasing in the display. This may reduce the displayed image
73 size. For example, with a 1920x1080 window, a 640x480 image would be letterboxed to 1440x1080 when noalias is
74 false. But that is a scaling factor of 2.25 which may create rendering aliasing. When noalias is true, the
75 letterboxed image size will be 1280x960 (scale factor of 2.0). */
76 void applyLetterBox(unsigned int & imw, unsigned int & imh, unsigned int const winw, unsigned int const winh,
77 bool noalias);
78
79 //! Split string into vector of tokens using a regex to specify what to split on; default regex splits by whitespace
80 std::vector<std::string> split(std::string const & input, std::string const & regex = "\\s+");
81
82 //! Concatenate a vector of tokens into a string
83 /*! Internally, we use std::to_string to convert each token to string, which may throw */
84 template <typename T>
85 std::string join(std::vector<T> const & tokens, std::string const & delimiter);
86
87 //! Concatenate a vector of string tokens into a string
88 template <>
89 std::string join<std::string>(std::vector<std::string> const & tokens, std::string const & delimiter);
90
91 //! Return true if str starts with prefix (including if both strings are equal)
92 /*! Note that if str is shorter than prefix, return is false (like in strncmp()). */
93 bool stringStartsWith(std::string const & str, std::string const & prefix);
94
95 //! Replace white space characters in a string with underscore (default) or another character
96 std::string replaceWhitespace(std::string const & str, char rep = '_');
97
98 //! Strip white space (including CR, LF, tabs, etc) from the end of a string
99 std::string strip(std::string const & str);
100
101 //! Extract a portion of a string between two delimiters
102 /*! Returns an empty string if the delimiters were not found. */
103 std::string extractString(std::string const & str, std::string const & startsep, std::string const & endsep);
104
105 //! Replace first instance of 'from' with 'to'
106 /*! Returns the number of replacements made (0 or 1). */
107 size_t replaceStringFirst(std::string & str, std::string const & from, std::string const & to);
108
109 //! Replace all instances of 'from' with 'to'
110 /*! Returns the number of replacements made. */
111 size_t replaceStringAll(std::string & str, std::string const & from, std::string const & to);
112
113 //! Replace all instances of 'from' with 'to'
114 /*! Returns the number of replacements made. */
115 std::string replaceAll(std::string const & str, std::string const & from, std::string const & to);
116
117 //! Convert string to lowercase
118 std::string tolower(std::string const & str);
119
120 //! Compute an absolute path from two paths
121 /*! Parameter \p path contains a path that could be either absolute or relative; parameter \p root should contain a
122 root path. If path is absolute, it is returned; otherwise, root is prepended to it and the result is returned. */
123 std::filesystem::path absolutePath(std::filesystem::path const & root, std::filesystem::path const & path);
124
125 //! Create a string using printf style arguments
126 /*! Example:
127 @code
128 std::string s = jevois::sformat("MyString_%f_%d", 1.0, 2);
129 @endcode
130
131 One should normally refrain from using sformat(), and instead use streaming operators of C++, one exception is
132 when issuing serial messages that have float numbers in them, the printf-like sytnax of sformat is useful to
133 quickly and easily specify a numerical precision. */
134 std::string sformat(char const * fmt, ...)
135 // NOTE: this __attribute__ tells gcc that it should issue printf-style warnings when compiling calls to sformat(),
136 // treating the 1st argument (fmt) as the format string, and the 2nd and subsequent arguments as the printf-style
137 // parameters
138 __attribute__((format(__printf__, 1, 2)));
139
140 // Doxygen is not too good with enable_if, it only documents one version of the function. Here is a workaround:
141#ifdef JEVOIS_DOXYGEN
142 //! Convert from string to a type
143 /*! For integral types, internally uses std::stoll() for that type, which supports prefixes like 0 (for octal) and 0x
144 (hex). Beware of that octal convention and do not pass leading zeros unless you mean it. For non-integral types,
145 internally uses operator>> for that type, so it works with any type that supports it. */
146 template <typename T> T from_string(std::string const & str);
147#else
148 //! Convert from string to a type, version for non-integral types
149 /*! This internally uses operator>> for that type, so it works with any type that supports it. */
150 template <typename T>
151 typename std::enable_if< ! std::is_integral<T>::value, T>::type from_string(std::string const & str);
152
153 //! Convert from string to a type, version for integral types
154 /*! This internally uses std::stoll() for that type, which supports prefixes like 0 (for octal) and 0x (hex). */
155 template <typename T>
156 typename std::enable_if<std::is_integral<T>::value, T>::type from_string(std::string const & str);
157#endif
158
159 //! Convert from type to string
160 /*! This internally uses operator>> for that type, so it works with any type that supports it. */
161 template <typename T>
162 std::string to_string(T const & val);
163
164 //! Clamped numerical conversion
165 template <typename dest_type, typename source_type>
166 dest_type clamped_convert(source_type source);
167
168 //! Flush the caches, may sometimes be useful when running the camera in turbo mode
169 void flushcache();
170
171 //! Execute a command and grab stdout output to a string
172 /*! If errtoo is true, we also grab errors by appending a 2>&1 to the command. Throws std::runtime_error if the
173 command cannot be run somehow, or if it exits with a non-zero exit code. */
174 std::string system(std::string const & cmd, bool errtoo = true);
175
176 //! Report a duration given in seconds with variable units (ns, us, ms, or s), with precision of 2 decimal points
177 std::string secs2str(double secs);
178
179 //! Report avg+/-std duration given in seconds with variable units (ns, us, ms, or s), with 1 decimal point
180 std::string secs2str(std::vector<double> secs);
181
182 //! Report a duration given in seconds with variable units (ns, us, ms, or s)
183 /*! You should decide on precision using std::setprecision(n) in your stream before calling this function. */
184 void secs2str(std::ostringstream & ss, double secs);
185
186 //! Report a number with variable multipliers (K, M, G, T, P, E, Z, Y), with precision of 2 decimal points
187 std::string num2str(double n);
188
189 //! Report a number with variable multipliers (K, M, G, T, P, E, Z, Y)
190 /*! You should decide on precision using std::setprecision(n) in your stream before calling this function. */
191 void num2str(std::ostringstream & ss, double n);
192
193 //! Read one line from a file and return it as a string
194 /*! Useful to get info from virtual kernel filesystems, such as CPU temperature, etc. Parameter \p skip optionally
195 specifies a number of lines to skip before returning the one of interest. */
196 std::string getFileString(char const * fname, int skip = 0);
197
198 /*! @} */ // **********************************************************************
199
200} // namespace jevois
201
202
203#ifdef JEVOIS_DOXYGEN
204// ####################################################################################################
205//! Helper macro to execute an ioctl, ignore interruptions, and, if error, issue a fatal message and throw
206/*! \def XIOCTL(dev, req, mem)
207 \hideinitializer
208
209 This macro assumes that req is an identifier (\#define) for the corresponding ioctl number.
210 \ingroup utils */
211#define XIOCTL(dev, req, mem) { }
212
213// ####################################################################################################
214//! Helper macro to execute an ioctl, ignore interruptions, and, if error throw quietly
215/*! \def XIOCTL_QUIET(dev, req, mem)
216 \hideinitializer
217
218 This is useful, e.g., for V4L2 camera enumeration of formats, where one is supposed to call an ioctl
219 with increasing format number until it fails. When that happens we don't want to display any fatal error
220 message as XIOCTL() does. This macro assumes that req is an identifier for the corresponding ioctl number.
221 \ingroup utils */
222#define XIOCTL_QUIET(dev, req, mem) { }
223
224// ####################################################################################################
225//! Helper macro to execute an ioctl, ignore interruptions, and, if error throw quietly
226/*! \def XIOCTL_QUIET_ONCE(dev, req, mem)
227 \hideinitializer
228
229 This is useful, e.g., for V4L2 camera enumeration of formats, where one is supposed to call an ioctl
230 with increasing format number until it fails. When that happens we don't want to display any fatal error
231 message as XIOCTL() does. This macro assumes that req is an identifier for the corresponding ioctl number.
232 Note that in this version we throw on any error.
233 \ingroup utils */
234#define XIOCTL_QUIET_ONCE(dev, req, mem) { }
235#endif
236
237// Include implementation details
238#include <jevois/Util/details/UtilsImpl.H>
std::string join< std::string >(std::vector< std::string > const &tokens, std::string const &delimiter)
Concatenate a vector of string tokens into a string.
unsigned int cvBytesPerPix(unsigned int cvtype)
Return the number of bytes per pixel for a given OpenCV pixel type.
Definition Utils.C:89
std::string strip(std::string const &str)
Strip white space (including CR, LF, tabs, etc) from the end of a string.
Definition Utils.C:309
size_t replaceStringFirst(std::string &str, std::string const &from, std::string const &to)
Replace first instance of 'from' with 'to'.
Definition Utils.C:332
unsigned int strfcc(std::string const &str)
Convert a JeVois video format string to V4L2 four-cc code (V4L2_PIX_FMT_...)
Definition Utils.C:111
void flushcache()
Flush the caches, may sometimes be useful when running the camera in turbo mode.
Definition Utils.C:450
std::string num2str(double n)
Report a number with variable multipliers (K, M, G, T, P, E, Z, Y), with precision of 2 decimal point...
Definition Utils.C:512
std::string extractString(std::string const &str, std::string const &startsep, std::string const &endsep)
Extract a portion of a string between two delimiters.
Definition Utils.C:317
unsigned int v4l2BytesPerPix(unsigned int fcc)
Return the number of bytes per pixel for a given V4L2_PIX_FMT_...
Definition Utils.C:141
std::string tolower(std::string const &str)
Convert string to lowercase.
Definition Utils.C:378
std::string secs2str(double secs)
Report a duration given in seconds with variable units (ns, us, ms, or s), with precision of 2 decima...
Definition Utils.C:479
std::string getFileString(char const *fname, int skip=0)
Read one line from a file and return it as a string.
Definition Utils.C:542
std::string cvtypestr(unsigned int cvtype)
Convert cv::Mat::type() code to to a string (e.g., CV_8UC1, CV_32SC3, etc)
Definition Utils.C:58
std::string system(std::string const &cmd, bool errtoo=true)
Execute a command and grab stdout output to a string.
Definition Utils.C:462
std::string join(std::vector< T > const &tokens, std::string const &delimiter)
Concatenate a vector of tokens into a string.
unsigned int whiteColor(unsigned int fcc)
Return a value that corresponds to white for the given video format.
Definition Utils.C:197
std::string T from_string(std::string const &str)
Convert from string to a type.
std::string sformat(char const *fmt,...) __attribute__((format(__printf__
Create a string using printf style arguments.
Definition Utils.C:440
std::string replaceWhitespace(std::string const &str, char rep='_')
Replace white space characters in a string with underscore (default) or another character.
Definition Utils.C:301
dest_type clamped_convert(source_type source)
Clamped numerical conversion.
size_t replaceStringAll(std::string &str, std::string const &from, std::string const &to)
Replace all instances of 'from' with 'to'.
Definition Utils.C:345
std::filesystem::path absolutePath(std::filesystem::path const &root, std::filesystem::path const &path)
Compute an absolute path from two paths.
Definition Utils.C:386
bool stringStartsWith(std::string const &str, std::string const &prefix)
Return true if str starts with prefix (including if both strings are equal)
Definition Utils.C:295
std::string fccstr(unsigned int fcc)
Convert a V4L2 four-cc code (V4L2_PIX_FMT_...) to a 4-char string.
Definition Utils.C:45
std::vector< std::string > split(std::string const &input, std::string const &regex="\\s+")
Split string into vector of tokens using a regex to specify what to split on; default regex splits by...
Definition Utils.C:270
void applyLetterBox(unsigned int &imw, unsigned int &imh, unsigned int const winw, unsigned int const winh, bool noalias)
Apply a letterbox resizing to fit an image into a window.
Definition Utils.C:222
std::string to_string(T const &val)
Convert from type to string.
unsigned int blackColor(unsigned int fcc)
Return a value that corresponds to black for the given video format.
Definition Utils.C:172
unsigned int v4l2ImageSize(unsigned int fcc, unsigned int width, unsigned int height)
Return the image size in bytes for a given V4L2_PIX_FMT_..., width, height.
Definition Utils.C:168
std::string replaceAll(std::string const &str, std::string const &from, std::string const &to)
Replace all instances of 'from' with 'to'.
Definition Utils.C:362
Main namespace for all JeVois classes and functions.
Definition Concepts.dox:2