main.cpp 3.85 KB
Newer Older
1

2
#include "image_dataset_metadata.h"
3
#include "metadata_editor.h"
4

5
6
#include <iostream>
#include <fstream>
7
#include <string>
8
9

#include <dlib/cmd_line_parser.h>
10
#include <dlib/dir_nav.h>
11
12


Davis King's avatar
Davis King committed
13
typedef dlib::cmd_line_parser<char>::check_1a_c parser_type;
14
15
16
17

using namespace std;
using namespace dlib;

18
19
// ----------------------------------------------------------------------------------------

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
std::string strip_path (
    const std::string& str,
    const std::string& prefix
)
{
    unsigned long i;
    for (i = 0; i < str.size() && i < prefix.size(); ++i)
    {
        if (str[i] != prefix[i]) 
            return str;
    }

    if (i < str.size() && (str[i] == '/' || str[i] == '\\'))
        ++i;

    return str.substr(i);
}

// ----------------------------------------------------------------------------------------

void make_empty_file (
    const std::string& filename
)
{
    ofstream fout(filename.c_str());
    if (!fout)
        throw dlib::error("ERROR: Unable to open " + filename + " for writing.");
}

// ----------------------------------------------------------------------------------------

Davis King's avatar
Davis King committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
void create_new_dataset (
    const parser_type& parser
)
{
    using namespace dlib::image_dataset_metadata;

    const std::string filename = parser.option("c").argument();
    // make sure the file exists so we can use the get_parent_directory() command to
    // figure out it's parent directory.
    make_empty_file(filename);
    const std::string parent_dir = get_parent_directory(file(filename)).full_name();

    unsigned long depth = 0;
    if (parser.option("r"))
        depth = 30;

    dataset meta;
    meta.name = "imglab dataset";
    meta.comment = "Created by imglab tool.";
    for (unsigned long i = 0; i < parser.number_of_arguments(); ++i)
    {
        try
        {
            const string temp = strip_path(file(parser[i]).full_name(), parent_dir);
            meta.images.push_back(image(temp));
        }
        catch (dlib::file::file_not_found&)
        {
            // then parser[i] should be a directory

            std::vector<file> files = get_files_in_directory_tree(parser[i], 
                                                                  match_endings(".png .PNG .jpeg .JPEG .jpg .JPG .bmp .BMP .dng .DNG"),
                                                                  depth);
            sort(files.begin(), files.end());

            for (unsigned long j = 0; j < files.size(); ++j)
            {
                meta.images.push_back(image(strip_path(files[j].full_name(), parent_dir)));
            }
        }
    }

    save_image_dataset_metadata(meta, filename);
}

// ----------------------------------------------------------------------------------------
97

98
99
100
101
102
103
104
105
106
int main(int argc, char** argv)
{
    try
    {

        parser_type parser;

        parser.add_option("h","Displays this information.");
        parser.add_option("c","Create an XML file named <arg> listing a set of images.",1);
107
        parser.add_option("r","Search directories recursively for images.");
108
109
110

        parser.parse(argc, argv);

111
        const char* singles[] = {"h","c","r"};
112
        parser.check_one_time_options(singles);
113
        parser.check_sub_option("c", "r");
114
115
116

        if (parser.option("h"))
        {
117
            cout << "Usage: imglab [options] <image files/directories or XML file>\n";
118
            parser.print_options(cout);
Davis King's avatar
Davis King committed
119
            cout << endl << endl;
120
121
122
123
124
            return EXIT_SUCCESS;
        }

        if (parser.option("c"))
        {
Davis King's avatar
Davis King committed
125
            create_new_dataset(parser);
126
127
128
            return EXIT_SUCCESS;
        }

129
130
        if (parser.number_of_arguments() == 1)
        {
131
132
            metadata_editor editor(parser[0]);
            editor.wait_until_closed();
133
        }
134
135
136
137
138
139
140
141
    }
    catch (exception& e)
    {
        cout << e.what() << endl;
        return EXIT_FAILURE;
    }
}

Davis King's avatar
Davis King committed
142
143
// ----------------------------------------------------------------------------------------