Add option to specify object classes list file
[tidl/tidl-api.git] / examples / common / object_classes.cpp
1 /******************************************************************************
2  * Copyright (c) 2018, Texas Instruments Incorporated - http://www.ti.com/
3  *   All rights reserved.
4  *
5  *   Redistribution and use in source and binary forms, with or without
6  *   modification, are permitted provided that the following conditions are met:
7  *       * Redistributions of source code must retain the above copyright
8  *         notice, this list of conditions and the following disclaimer.
9  *       * Redistributions in binary form must reproduce the above copyright
10  *         notice, this list of conditions and the following disclaimer in the
11  *         documentation and/or other materials provided with the distribution.
12  *       * Neither the name of Texas Instruments Incorporated nor the
13  *         names of its contributors may be used to endorse or promote products
14  *         derived from this software without specific prior written permission.
15  *
16  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  *   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26  *   THE POSSIBILITY OF SUCH DAMAGE.
27  *****************************************************************************/
29 #include "object_classes.h"
31 extern "C" {
32     #include <json-c/json.h>
33 }
36 ObjectClasses::ObjectClasses(const std::string& json_file) : num_classes_m(0)
37 {
38     struct json_object *ocs = json_object_from_file(json_file.c_str());
39     if (ocs != nullptr)
40     {
41         struct json_object *net_name, *objs, *obj, *label, *color;
42         if (json_object_object_get_ex(ocs, "network", &net_name))
43             network_name_m = json_object_get_string(net_name);
45         if (json_object_object_get_ex(ocs, "objects", &objs))
46         {
47             num_classes_m = json_object_array_length(objs);
48             for (unsigned int i = 0; i < num_classes_m; i++)
49             {
50                 obj = json_object_array_get_idx(objs, i);
52                 std::string s_label;
53                 if (json_object_object_get_ex(obj, "label", &label))
54                     s_label = json_object_get_string(label);
55                 else
56                     s_label = "label" + std::to_string(i);
58                 unsigned char b, g, r;
59                 if (json_object_object_get_ex(obj, "color_bgr", &color))
60                 {
61                     b = json_object_get_int(json_object_array_get_idx(color,0));
62                     g = json_object_get_int(json_object_array_get_idx(color,1));
63                     r = json_object_get_int(json_object_array_get_idx(color,2));
64                 }
65                 else
66                     b = g = r = 255;
68                 classes_m.emplace_back(s_label, b, g, r);
69             }
70         }
72         json_object_put(ocs);  // decrement refcount and free
73     }
75     classes_m.emplace_back("unknown", 0, 0, 0);  // sentinel
76 }
78 const ObjectClass& ObjectClasses::At(unsigned int index)
79 {
80     if (index < num_classes_m)  return classes_m[index];
81     else                        return classes_m[num_classes_m];
82 }