1 #include <iostream>
2 #include <cstdlib>
3 #include <boxm2/class/boxm2_class_generate_samples.h>
4 
5 //executable args
6 #include "vul/vul_arg.h"
7 #include "vul/vul_file.h"
8 
9 //boxm2 scene stuff
10 #include <boxm2/io/boxm2_dumb_cache.h>
11 #include <boxm2/boxm2_scene.h>
12 #include <boxm2/boxm2_util.h>
13 
14 #ifdef _MSC_VER
15 #  include "vcl_msvc_warnings.h"
16 #endif
17 
18 //check dirs, exit if not exist
check_dir(std::string & dir)19 void check_dir(std::string& dir)
20 {
21   if (!vul_file::exists(dir)) {
22     std::cout<<"Directory of file does not exist: "<<dir<<std::endl;
23     std::exit(-1);
24   }
25 }
26 
27 //push back vector onto vector
28 template <class T>
push_back(std::vector<T> & dest,std::vector<T> & src)29 void push_back(std::vector<T>& dest, std::vector<T>& src)
30 {
31   for (unsigned int i=0; i<src.size(); ++i)
32     dest.push_back(src[i]);
33 }
34 
35 
main(int argc,char ** argv)36 int main(int argc, char ** argv)
37 {
38   vul_arg<std::string> eoDir("-eoImgs", "EO Image input directory", "");
39   vul_arg<std::string> irDir("-irImgs", "IR Image input directory", "");
40   vul_arg<std::string> xmlDir("-a", "Annotations directory (label me xml files per image)");
41   vul_arg<bool>       sparse("-sparse", "Make the sampling of pixels sparse", false);
42   vul_arg_parse(argc, argv);
43 
44   //check diarectories
45   check_dir(eoDir());
46   check_dir(irDir());
47   check_dir(xmlDir());
48 
49   //grab images and xml files from directory
50   std::vector<std::string> eoImgs;
51   std::vector<std::string> irImgs;
52   std::vector<std::string> xmlFiles;
53   if (vul_file::is_directory(eoDir())) {
54     eoImgs = boxm2_util::images_from_directory(eoDir());
55     irImgs = boxm2_util::images_from_directory(irDir());
56     xmlFiles = boxm2_util::files_from_dir(xmlDir(), "xml");
57   }
58   else {
59     eoImgs.push_back(eoDir());
60     irImgs.push_back(irDir());
61     xmlFiles.push_back(xmlDir());
62   }
63   std::cout<<"Generating samples for "<<eoDir()<<','<<irDir()<<','<<" using "<<xmlDir()<<'\n'
64           <<"  num images: "<<xmlFiles.size()<<'\n'
65           <<"  num eo: "<<eoImgs.size()<<'\n'
66           <<"  num ir: "<<irImgs.size()<<std::endl;
67 
68   //set the number of samples K to take from each image
69   auto K = std::size_t(sparse() ? 10000 : 0x7fffffff);
70 
71   //boxm2_class_generate_samples sampler(;a
72   std::vector<vnl_vector_fixed<float,4> > allInts;
73   std::vector<std::string> allClasses;
74   for (unsigned int i=0; i<xmlFiles.size(); ++i) {
75     //generate IR samples
76     boxm2_class_generate_samples sampler(xmlFiles[i], eoImgs[i], irImgs[i], K);
77     std::vector<std::string> classes = sampler.classes();
78     std::vector<float> ints = sampler.intensities();
79     std::vector<float> r = sampler.r();
80     std::vector<float> g = sampler.g();
81     std::vector<float> b = sampler.b();
82 
83     std::vector<vnl_vector_fixed<float,4> > feats;
84     for (unsigned int i=0; i<r.size(); ++i)
85       feats.emplace_back(ints[i],r[i],g[i],b[i] );
86 
87     //stack
88     push_back(allInts, feats);
89     push_back(allClasses, classes);
90   }
91 
92   //print samples/write to file
93   for (unsigned int i=0; i<allInts.size(); ++i) {
94     std::cout<<allClasses[i]<<"  "<<allInts[i]<<std::endl;
95   }
96 }
97