Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
testIoPPM.cpp
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2024 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 * Read and write PGM images on the disk.
32 */
33
34#include <visp3/core/vpDebug.h>
35#include <visp3/core/vpImage.h>
36#include <visp3/core/vpIoTools.h>
37#include <visp3/io/vpImageIo.h>
38#include <visp3/io/vpParseArgv.h>
39
40#include <stdio.h>
41#include <stdlib.h>
42
49
50// List of allowed command line options
51#define GETOPTARGS "cdi:o:h"
52
53#ifdef ENABLE_VISP_NAMESPACE
54using namespace VISP_NAMESPACE_NAME;
55#endif
56
57/*
58
59 Print the program options.
60
61 \param name : Program name.
62 \param badparam : Bad parameter name.
63 \param ipath : Input image path.
64 \param opath : Output image path.
65 \param user : Username.
66
67 */
68void usage(const char *name, const char *badparam, const std::string &ipath, const std::string &opath,
69 const std::string &user)
70{
71 fprintf(stdout, "\n\
72Read and write PPM images on the disk. Also test exceptions.\n\
73\n\
74SYNOPSIS\n\
75 %s [-i <input image path>] [-o <output image path>]\n\
76 [-h]\n\
77",
78name);
79
80 fprintf(stdout, "\n\
81OPTIONS: Default\n\
82 -i <input image path> %s\n\
83 Set image input path.\n\
84 From this path read \"Klimt/Klimt.pgm\"\n\
85 and \"Klimt/Klimt.ppm\" images.\n\
86 Setting the VISP_INPUT_IMAGE_PATH environment\n\
87 variable produces the same behaviour than using\n\
88 this option.\n\
89\n\
90 -o <output image path> %s\n\
91 Set image output path.\n\
92 From this directory, creates the \"%s\"\n\
93 subdirectory depending on the username, where \n\
94 Klimt_grey.ppm and Klimt_color.ppm output image\n\
95 are written.\n\
96\n\
97 -h\n\
98 Print the help.\n\n",
99 ipath.c_str(), opath.c_str(), user.c_str());
100
101 if (badparam)
102 fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
103}
104
117bool getOptions(int argc, const char **argv, std::string &ipath, std::string &opath, const std::string &user)
118{
119 const char *optarg_;
120 int c;
121 while ((c = vpParseArgv::parse(argc, argv, GETOPTARGS, &optarg_)) > 1) {
122
123 switch (c) {
124 case 'i':
125 ipath = optarg_;
126 break;
127 case 'o':
128 opath = optarg_;
129 break;
130 case 'h':
131 usage(argv[0], nullptr, ipath, opath, user);
132 return false;
133
134 case 'c':
135 case 'd':
136 break;
137
138 default:
139 usage(argv[0], optarg_, ipath, opath, user);
140 return false;
141 }
142 }
143
144 if ((c == 1) || (c == -1)) {
145 // standalone param or error
146 usage(argv[0], nullptr, ipath, opath, user);
147 std::cerr << "ERROR: " << std::endl;
148 std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
149 return false;
150 }
151
152 return true;
153}
154
155int main(int argc, const char **argv)
156{
157 try {
158 std::string env_ipath;
159 std::string opt_ipath;
160 std::string opt_opath;
161 std::string ipath;
162 std::string opath;
163 std::string filename;
164 std::string username;
165
166 // Get the visp-images-data package path or VISP_INPUT_IMAGE_PATH
167 // environment variable value
169
170 // Set the default input path
171 if (!env_ipath.empty())
172 ipath = env_ipath;
173
174// Set the default output path
175#if defined(_WIN32)
176 opt_opath = "C:/temp";
177#else
178 opt_opath = "/tmp";
179#endif
180
181 // Get the user login name
182 vpIoTools::getUserName(username);
183
184 // Read the command line options
185 if (getOptions(argc, argv, opt_ipath, opt_opath, username) == false) {
186 return EXIT_FAILURE;
187 }
188
189 // Get the option values
190 if (!opt_ipath.empty())
191 ipath = opt_ipath;
192 if (!opt_opath.empty())
193 opath = opt_opath;
194
195 // Append to the output path string, the login name of the user
196 opath = vpIoTools::createFilePath(opath, username);
197
198 // Test if the output path exist. If no try to create it
199 if (vpIoTools::checkDirectory(opath) == false) {
200 try {
201 // Create the dirname
203 }
204 catch (...) {
205 usage(argv[0], nullptr, ipath, opt_opath, username);
206 std::cerr << std::endl << "ERROR:" << std::endl;
207 std::cerr << " Cannot create " << opath << std::endl;
208 std::cerr << " Check your -o " << opt_opath << " option " << std::endl;
209 return EXIT_FAILURE;
210 }
211 }
212
213 // Compare ipath and env_ipath. If they differ, we take into account
214 // the input path coming from the command line option
215 if (!opt_ipath.empty() && !env_ipath.empty()) {
216 if (ipath != env_ipath) {
217 std::cout << std::endl << "WARNING: " << std::endl;
218 std::cout << " Since -i <visp image path=" << ipath << "> "
219 << " is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
220 << " we skip the environment variable." << std::endl;
221 }
222 }
223
224 // Test if an input path is set
225 if (opt_ipath.empty() && env_ipath.empty()) {
226 usage(argv[0], nullptr, ipath, opt_opath, username);
227 std::cerr << std::endl << "ERROR:" << std::endl;
228 std::cerr << " Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
229 << " environment variable to specify the location of the " << std::endl
230 << " image path where test images are located." << std::endl
231 << std::endl;
232 return EXIT_FAILURE;
233 }
234
235 //
236 // Here starts really the test
237 //
238
240 // Create a grey level image
242
243 // Load a color image from the disk and convert it to a grey level one
244 filename = vpIoTools::createFilePath(ipath, "Klimt/Klimt.ppm");
245 std::cout << "Read image: " << filename << std::endl;
246 vpImageIo::read(I, filename);
247 // Write the content of the image on the disk
248 filename = vpIoTools::createFilePath(opath, "Klimt_grey.ppm");
249 std::cout << "Write image: " << filename << std::endl;
250 vpImageIo::write(I, filename);
251
252 // Try to load a non existing image (test for exceptions)
253 try {
254 // Load a non existing grey image
255 filename = vpIoTools::createFilePath(ipath, "image-that-does-not-exist.ppm");
256 std::cout << "Read image: " << filename << std::endl;
257 vpImageIo::read(I, filename);
258 }
259 catch (vpImageException &e) {
260 vpERROR_TRACE("at main level");
261 std::cout << e << std::endl;
262 }
263
264 // Try to write an image to a non existing directory
265 try {
266 filename = vpIoTools::createFilePath(opath, "directory-that-does-not-exist/Klimt.ppm");
267 std::cout << "Write image: " << filename << std::endl;
268 vpImageIo::write(I, filename);
269 }
270 catch (const vpException &e) {
271 std::cout << "Catch an exception due to a non existing file: " << e << std::endl;
272 }
273
275 // Create a color image
276 vpImage<vpRGBa> Irgba;
277
278 // Load a color image from the disk
279 filename = vpIoTools::createFilePath(ipath, "Klimt/Klimt.ppm");
280 std::cout << "Read image: " << filename << std::endl;
281 vpImageIo::read(Irgba, filename);
282 // Write the content of the color image on the disk
283 filename = vpIoTools::createFilePath(opath, "Klimt_color.ppm");
284 std::cout << "Write image: " << filename << std::endl;
285 vpImageIo::write(Irgba, filename);
286
287 try {
288 // Try to load a non existing image (test for exceptions)
289 // Load a non existing color image
290 filename = vpIoTools::createFilePath(ipath, "image-that-does-not-exist.ppm");
291 std::cout << "Read image: " << filename << std::endl;
292 vpImageIo::read(Irgba, filename);
293 }
294 catch (const vpException &e) {
295 std::cout << "Catch an exception due to a non existing file: " << e << std::endl;
296 }
297
298 try {
299 // Try to write a color image to a non existing directory
300 filename = vpIoTools::createFilePath(opath, "directory-that-does-not-exist/Klimt.ppm");
301 std::cout << "Write image: " << filename << std::endl;
302 vpImageIo::write(Irgba, filename);
303 }
304 catch (const vpException &e) {
305 std::cout << "Catch an exception due to a non existing file: " << e << std::endl;
306 }
307 std::cout << "Test succeed" << std::endl;
308 return EXIT_SUCCESS;
309 }
310 catch (const vpException &e) {
311 std::cout << "Catch an exception: " << e << std::endl;
312 return EXIT_FAILURE;
313 }
314}
error that can be emitted by ViSP classes.
Definition vpException.h:60
Error that can be emitted by the vpImage class and its derivatives.
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition of the vpImage class member functions.
Definition vpImage.h:131
static std::string getViSPImagesDataPath()
static bool checkDirectory(const std::string &dirname)
static std::string getUserName()
static std::string createFilePath(const std::string &parent, const std::string &child)
static void makeDirectory(const std::string &dirname)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
#define vpERROR_TRACE
Definition vpDebug.h:423