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 }