53 #include <visp/vpConfig.h>
54 #include <visp/vpDebug.h>
56 #if ((defined (VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI)) && (VISP_HAVE_OPENCV_VERSION >= 0x020000))
60 #include <visp/vpFernClassifier.h>
61 #include <visp/vpParseArgv.h>
62 #include <visp/vpConfig.h>
63 #include <visp/vpOpenCVGrabber.h>
64 #include <visp/vpImage.h>
65 #include <visp/vpDisplayX.h>
66 #include <visp/vpDisplayGTK.h>
67 #include <visp/vpDisplayGDI.h>
68 #include <visp/vpHomography.h>
69 #include <visp/vpImageIo.h>
70 #include <visp/vpIoTools.h>
71 #include <visp/vpTime.h>
74 #define GETOPTARGS "hlcdb:i:sp"
76 void usage(
const char *name,
const char *badparam);
77 bool getOptions(
int argc,
const char **argv,
bool &isLearning, std::string& dataFile,
bool& click_allowed,
78 bool& display,
bool& displayPoints,
bool& useSequence, std::string& ipath);
88 void usage(
const char *name,
const char *badparam)
91 Detection of points of interests and matching using the Ferns classifier. The \
92 object needs first to be learned (-l option). This learning process will create\
93 a file used to detect the object.\n\
96 %s [-l] [-h] [-b] [-c] [-d] [-p] [-i] [-s]\n", name);
103 -i <input image path> \n\
104 Set image input path.\n\
105 From this path read \"ViSP-images/line/image.%%04d.pgm\"\n\
107 Setting the VISP_INPUT_IMAGE_PATH environment\n\
108 variable produces the same behaviour than using\n\
112 database filename to use (default is ./dataFern).\n\
115 Disable the mouse click. Useful to automaze the \n\
116 execution of this program without humain intervention.\n\
119 Turn off the display.\n\
122 Turn off the use of the sequence and use a webcam.\n\
125 display points of interest.\n\
128 Print this help.\n");
131 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
152 bool getOptions(
int argc,
const char **argv,
bool &isLearning, std::string& dataFile,
bool& click_allowed,
153 bool& display,
bool& displayPoints,
bool& useSequence, std::string& ipath)
160 case 'c': click_allowed =
false;
break;
161 case 'd': display =
false;
break;
162 case 'l': isLearning =
true;
break;
163 case 'h': usage(argv[0], NULL);
return false;
break;
164 case 'b': dataFile = optarg_;
break;
165 case 'p': displayPoints =
true;
break;
166 case 's': useSequence =
false;
break;
167 case 'i': ipath = optarg_;
break;
169 usage(argv[0], optarg_);
174 if ((c == 1) || (c == -1)) {
176 usage(argv[0], NULL);
177 std::cerr <<
"ERROR: " << std::endl;
178 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
188 main(
int argc,
const char** argv)
191 bool isLearning =
false;
192 std::string dataFile(
"./dataFern");
193 bool opt_click_allowed =
true;
194 bool opt_display =
true;
195 std::string objectName(
"object");
196 bool displayPoints =
false;
197 bool useSequence =
true;
198 std::string opt_ipath;
200 std::string env_ipath;
202 std::string filename;
205 char *ptenv = getenv(
"VISP_INPUT_IMAGE_PATH");
211 if (! env_ipath.empty()){
216 if (getOptions(argc, argv,
217 isLearning, dataFile, opt_click_allowed, opt_display, displayPoints, useSequence, opt_ipath) ==
false) {
222 if (useSequence && !opt_ipath.empty()){
228 if (useSequence && !opt_ipath.empty() && !env_ipath.empty()) {
229 if (ipath != env_ipath) {
230 std::cout << std::endl
231 <<
"WARNING: " << std::endl;
232 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
233 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
234 <<
" we skip the environment variable." << std::endl;
239 if (useSequence && opt_ipath.empty() && env_ipath.empty()){
240 usage(argv[0], NULL);
241 std::cerr << std::endl
242 <<
"ERROR:" << std::endl;
243 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
245 <<
" environment variable to specify the location of the " << std::endl
246 <<
" image path where test images are located." << std::endl << std::endl;
261 std::ostringstream s;
262 s.setf(std::ios::right, std::ios::adjustfield);
263 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
264 filename = dirname + s.str();
274 vpCTRACE <<
"Load: " << filename << std::endl;
285 std::cerr << std::endl
286 <<
"ERROR:" << std::endl;
287 std::cerr <<
" Cannot read " << filename << std::endl;
288 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
289 <<
" or VISP_INPUT_IMAGE_PATH environment variable."
302 std::cout <<
"problem to initialise the framegrabber" << std::endl;
310 #if defined VISP_HAVE_X11
312 #elif defined VISP_HAVE_GTK
314 #elif defined VISP_HAVE_GDI
318 #if defined VISP_HAVE_X11
320 #elif defined VISP_HAVE_GTK
322 #elif defined VISP_HAVE_GDI
331 displayRef.
init(Iref, 100, 100,
"Reference image") ;
336 if (opt_display && opt_click_allowed){
337 std::cout <<
"Click on the top left and the bottom right corners to define the reference plane" << std::endl;
338 for (
int i=0 ; i < 2 ; i++){
340 std::cout << corners[i] << std::endl;
354 if (opt_click_allowed){
355 std::cout <<
"Click on the image to continue" << std::endl;
359 vpRect roi(corners[0], corners[1]);
361 std::cout <<
"> train the classifier on the selected plane. (may take up to several minutes)." << std::endl;
374 std::cout <<
"unknown error, line " << __LINE__ << std::endl;
377 fern.
record(objectName, dataFile);
383 std::cout <<
"unknown error, line " << __LINE__ << std::endl;
385 std::cout << __LINE__ << std::endl;
389 vpERROR_TRACE(
"cannot load the database with the specified name. Has the object been learned with the -l option? ");
394 fern.
load(dataFile, objectName);
397 vpERROR_TRACE(
"cannot load the database with the specified name. Has the object been learned with the -l option? ");
404 display.
init(I, 110 + (
int)Iref.
getWidth(), 100,
"Current image") ;
409 if (opt_display && opt_click_allowed){
410 std::cout <<
"Click on the current image to continue" << std::endl;
412 (
char*)
"Click on the current image to continue",
vpColor::red);
425 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
426 filename = dirname + s.str();
451 std::cout <<
"unknown error line " << __LINE__ << std::endl;
454 std::cout <<
"matching " << nbpts <<
" points : " <<
vpTime::measureTimeMs () - t0 <<
" ms" << std::endl;
470 std::cout <<
"Catch an exception: " << e << std::endl;
479 #if ( ! (defined (VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI)) )
480 vpERROR_TRACE(
"You do not have X11, GTK or GDI display functionalities...");
482 vpERROR_TRACE(
"You do not have OpenCV-2.0.0 or a more recent release...");
const char * getMessage(void)
unsigned int getWidth() const
virtual unsigned int matchPoint(const vpImage< unsigned char > &I)
Display for windows using GDI (available on any windows 32 platform).
Define the X11 console to display images.
error that can be emited by ViSP classes.
static double measureTimeMs()
static const vpColor green
static void flush(const vpImage< unsigned char > &I)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
virtual unsigned int buildReference(const vpImage< unsigned char > &I)
static void display(const vpImage< unsigned char > &I)
The vpDisplayGTK allows to display image using the GTK+ library version 1.2.
virtual void displayRectangle(const vpImagePoint &topLeft, unsigned int width, unsigned int height, const vpColor &color, bool fill=false, unsigned int thickness=1)=0
void record(const std::string &_objectName, const std::string &_dataFile)
record the Ferns classifier in the text file
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const char *title=NULL)
virtual void displayCharString(const vpImagePoint &ip, const char *text, const vpColor &color=vpColor::green)=0
void acquire(vpImage< unsigned char > &I)
unsigned int getHeight() const
Defines a rectangle in the plane.
virtual bool getClick(bool blocking=true)=0
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void load(const std::string &_dataFile, const std::string &)
load the Fern classifier
virtual void display(const vpImage< unsigned char > &Iref, const vpImage< unsigned char > &Icurrent, unsigned int size=3)
static void read(vpImage< unsigned char > &I, const char *filename)
Class for cameras video capture using OpenCV library.
void set_ij(const double ii, const double jj)
Class that implements the Fern classifier and the YAPE detector thanks to the OpenCV library...