34 #ifndef vpImageQueue_h
35 #define vpImageQueue_h
37 #include <visp3/core/vpConfig.h>
39 #if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11) && defined(VISP_HAVE_THREADS)
41 #include <condition_variable>
47 #include <visp3/core/vpDisplay.h>
48 #include <visp3/core/vpIoTools.h>
75 : m_cancelled(false), m_cond(), m_queue_image(), m_queue_data(), m_maxQueueSize(1024 * 8), m_mutex(),
76 m_seqname(seqname), m_recording_mode(record_mode), m_start_recording(false), m_directory_to_create(false),
77 m_recording_trigger(false)
80 if (!m_directory.empty()) {
82 m_directory_to_create =
true;
86 std::string(
"Record mode: ") + (m_recording_mode ? std::string(
"single") : std::string(
"continuous"));
94 std::lock_guard<std::mutex> lock(m_mutex);
95 std::cout <<
"Wait to finish saving images..." << std::endl;
124 std::unique_lock<std::mutex> lock(m_mutex);
126 while (m_queue_image.empty()) {
138 I = m_queue_image.front();
142 if (!m_queue_data.empty()) {
143 data = m_queue_data.front();
156 std::lock_guard<std::mutex> lock(m_mutex);
158 m_queue_image.push(I);
160 if (data !=
nullptr) {
161 m_queue_data.push(*data);
165 while (m_queue_image.size() > m_maxQueueSize) {
169 if (data !=
nullptr) {
170 while (m_queue_data.size() > m_maxQueueSize) {
188 bool disable_left_click =
false)
191 if (!m_seqname.empty()) {
192 if (!disable_left_click) {
193 if (!m_recording_mode) {
194 if (m_start_recording) {
218 if (!m_seqname.empty()) {
224 if (!m_seqname.empty()) {
226 m_start_recording = !m_start_recording;
237 else if (!m_seqname.empty()) {
238 m_start_recording =
true;
241 if (trigger_recording) {
242 m_start_recording =
true;
245 m_recording_trigger = m_start_recording;
247 if (m_start_recording) {
249 if (m_directory_to_create) {
250 std::cout <<
"Create directory \"" << m_directory <<
"\"" << std::endl;
252 m_directory_to_create =
false;
257 if (m_recording_mode == 1) {
258 m_start_recording =
false;
268 void setMaxQueueSize(
const size_t max_queue_size) { m_maxQueueSize = max_queue_size; }
272 std::condition_variable m_cond;
273 std::queue<vpImage<Type> > m_queue_image;
274 std::queue<std::string> m_queue_data;
275 size_t m_maxQueueSize;
277 std::string m_seqname;
278 std::string m_directory;
279 int m_recording_mode;
280 bool m_start_recording;
281 std::string m_text_record_mode;
282 bool m_directory_to_create;
283 bool m_recording_trigger;
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
unsigned int getDownScalingFactor()
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
int getRecordingMode() const
bool record(const vpImage< Type > &I, std::string *data=nullptr, bool trigger_recording=false, bool disable_left_click=false)
void pop(vpImage< Type > &I, std::string &data)
bool getRecordingTrigger() const
vpImageQueue(const std::string &seqname, int record_mode)
std::string getSeqName() const
void setMaxQueueSize(const size_t max_queue_size)
void push(const vpImage< Type > &I, std::string *data)
Definition of the vpImage class member functions.