Visual Servoing Platform  version 3.6.1 under development (2024-03-18)
vpDiskGrabber.cpp
1 /*
2  * ViSP, open source Visual Servoing Platform software.
3  * Copyright (C) 2005 - 2023 by Inria. All rights reserved.
4  *
5  * This software is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See https://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  *
30  * Description:
31  * Disk framegrabber.
32  */
33 
34 #include <visp3/io/vpDiskGrabber.h>
35 
37  : m_image_number(0), m_image_number_next(0), m_image_step(1), m_number_of_zero(0), m_directory("/tmp"),
38  m_base_name("I"), m_extension("pgm"), m_use_generic_name(false), m_generic_name("empty")
39 {
40  init = false;
41 }
42 
43 
44 vpDiskGrabber::vpDiskGrabber(const std::string &generic_name)
45  : m_image_number(0), m_image_number_next(0), m_image_step(1), m_number_of_zero(0), m_directory("/tmp"),
46  m_base_name("I"), m_extension("pgm"), m_use_generic_name(true), m_generic_name(generic_name)
47 {
48  init = false;
49 }
50 
51 vpDiskGrabber::vpDiskGrabber(const std::string &dir, const std::string &basename, long number, int step,
52  unsigned int noz, const std::string &ext)
53  : m_image_number(number), m_image_number_next(number), m_image_step(step), m_number_of_zero(noz), m_directory(dir),
54  m_base_name(basename), m_extension(ext), m_use_generic_name(false), m_generic_name("empty"), m_image_name()
55 {
56  init = false;
57 }
58 
60 {
61  long first_number = getImageNumber();
62 
63  acquire(I);
64 
65  setImageNumber(first_number);
66 
67  width = I.getWidth();
68  height = I.getHeight();
69 
70  init = true;
71 }
72 
74 {
75  // First we save the image number, so that it can be reaffected after the
76  // acquisition. That means that the first image is readed twice
77  long first_number = getImageNumber();
78 
79  acquire(I);
80 
81  setImageNumber(first_number);
82 
83  width = I.getWidth();
84  height = I.getHeight();
85 
86  init = true;
87 }
88 
90 {
91  // First we save the image number, so that it can be reaffected after the
92  // acquisition. That means that the first image is readed twice
93  long first_number = getImageNumber();
94 
95  acquire(I);
96 
97  setImageNumber(first_number);
98 
99  width = I.getWidth();
100  height = I.getHeight();
101 
102  init = true;
103 }
104 
106 {
107  m_image_number = m_image_number_next;
108  std::stringstream ss;
109 
110  if (m_use_generic_name) {
111  char filename[FILENAME_MAX];
112  snprintf(filename, FILENAME_MAX, m_generic_name.c_str(), m_image_number);
113  ss << filename;
114  }
115  else {
116  ss << m_directory << "/" << m_base_name << std::setfill('0') << std::setw(m_number_of_zero) << m_image_number << "."
117  << m_extension;
118  }
119 
120  m_image_number_next += m_image_step;
121  m_image_name = ss.str();
122  vpImageIo::read(I, m_image_name);
123 
124  width = I.getWidth();
125  height = I.getHeight();
126 }
127 
129 {
130  m_image_number = m_image_number_next;
131  std::stringstream ss;
132 
133  if (m_use_generic_name) {
134  char filename[FILENAME_MAX];
135  snprintf(filename, FILENAME_MAX, m_generic_name.c_str(), m_image_number);
136  ss << filename;
137  }
138  else {
139  ss << m_directory << "/" << m_base_name << std::setfill('0') << std::setw(m_number_of_zero) << m_image_number << "."
140  << m_extension;
141  }
142 
143  m_image_number_next += m_image_step;
144  m_image_name = ss.str();
145  vpImageIo::read(I, m_image_name);
146 
147  width = I.getWidth();
148  height = I.getHeight();
149 }
150 
152 {
153  m_image_number = m_image_number_next;
154  std::stringstream ss;
155  if (m_use_generic_name) {
156  char filename[FILENAME_MAX];
157  snprintf(filename, FILENAME_MAX, m_generic_name.c_str(), m_image_number);
158  ss << filename;
159  }
160  else {
161  ss << m_directory << "/" << m_base_name << std::setfill('0') << std::setw(m_number_of_zero) << m_image_number << "."
162  << m_extension;
163  }
164 
165  m_image_number_next += m_image_step;
166 
167  vpImageIo::readPFM(I, ss.str());
168 
169  width = I.getWidth();
170  height = I.getHeight();
171 }
172 
174 {
175  m_image_number = image_number;
176  std::stringstream ss;
177  if (m_use_generic_name) {
178  char filename[FILENAME_MAX];
179  snprintf(filename, FILENAME_MAX, m_generic_name.c_str(), m_image_number);
180  ss << filename;
181  }
182  else {
183  ss << m_directory << "/" << m_base_name << std::setfill('0') << std::setw(m_number_of_zero) << m_image_number << "."
184  << m_extension;
185  }
186 
187  m_image_number_next = m_image_number + m_image_step;
188 
189  vpImageIo::read(I, ss.str());
190 
191  width = I.getWidth();
192  height = I.getHeight();
193 }
194 
195 void vpDiskGrabber::acquire(vpImage<vpRGBa> &I, long image_number)
196 {
197  m_image_number = image_number;
198  std::stringstream ss;
199  if (m_use_generic_name) {
200  char filename[FILENAME_MAX];
201  snprintf(filename, FILENAME_MAX, m_generic_name.c_str(), m_image_number);
202  ss << filename;
203  }
204  else {
205  ss << m_directory << "/" << m_base_name << std::setfill('0') << std::setw(m_number_of_zero) << m_image_number << "."
206  << m_extension;
207  }
208 
209  m_image_number_next = m_image_number + m_image_step;
210 
211  vpImageIo::read(I, ss.str());
212 
213  width = I.getWidth();
214  height = I.getHeight();
215 }
216 
217 void vpDiskGrabber::acquire(vpImage<float> &I, long image_number)
218 {
219  m_image_number = m_image_number_next;
220  std::stringstream ss;
221  if (m_use_generic_name) {
222  char filename[FILENAME_MAX];
223  snprintf(filename, FILENAME_MAX, m_generic_name.c_str(), m_image_number);
224  ss << filename;
225  }
226  else {
227  ss << m_directory << "/" << m_base_name << std::setfill('0') << std::setw(m_number_of_zero) << image_number << "."
228  << m_extension;
229  }
230 
231  m_image_number_next += m_image_step;
232 
233  vpImageIo::readPFM(I, ss.str());
234 
235  width = I.getWidth();
236  height = I.getHeight();
237 }
238 
240 {
241  m_image_number = number;
242  m_image_number_next = number;
243 }
244 
245 void vpDiskGrabber::setGenericName(const std::string &generic_name)
246 {
247  m_generic_name = generic_name;
248  m_use_generic_name = true;
249 }
void open(vpImage< unsigned char > &I)
void setGenericName(const std::string &genericName)
void setImageNumber(long number)
long getImageNumber() const
void acquire(vpImage< unsigned char > &I)
unsigned int height
Number of rows in the image.
bool init
Set to true if the frame grabber has been initialized.
unsigned int width
Number of columns in the image.
static void readPFM(vpImage< float > &I, const std::string &filename)
Definition: vpImageIo.cpp:1340
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition: vpImageIo.cpp:143
unsigned int getWidth() const
Definition: vpImage.h:249
unsigned int getHeight() const
Definition: vpImage.h:184