1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker #include <catch.hpp>
6*89c4ff92SAndroid Build Coastguard Worker #include <opencv2/opencv.hpp>
7*89c4ff92SAndroid Build Coastguard Worker #include "ImageUtils.hpp"
8*89c4ff92SAndroid Build Coastguard Worker #include "Types.hpp"
9*89c4ff92SAndroid Build Coastguard Worker
GetBoundingBoxPoints(std::vector<od::DetectedObject> & decodedResults,cv::Mat imageMat)10*89c4ff92SAndroid Build Coastguard Worker std::vector<std::tuple<int, int>> GetBoundingBoxPoints(std::vector<od::DetectedObject>& decodedResults,
11*89c4ff92SAndroid Build Coastguard Worker cv::Mat imageMat)
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker std::vector<std::tuple<int, int>> bboxes;
14*89c4ff92SAndroid Build Coastguard Worker for(const od::DetectedObject& object : decodedResults)
15*89c4ff92SAndroid Build Coastguard Worker {
16*89c4ff92SAndroid Build Coastguard Worker const od::BoundingBox& bbox = object.GetBoundingBox();
17*89c4ff92SAndroid Build Coastguard Worker
18*89c4ff92SAndroid Build Coastguard Worker if (bbox.GetX() + bbox.GetWidth() > imageMat.cols)
19*89c4ff92SAndroid Build Coastguard Worker {
20*89c4ff92SAndroid Build Coastguard Worker for (int y = bbox.GetY(); y < bbox.GetY() + bbox.GetHeight(); ++y)
21*89c4ff92SAndroid Build Coastguard Worker {
22*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{bbox.GetX(), y});
23*89c4ff92SAndroid Build Coastguard Worker }
24*89c4ff92SAndroid Build Coastguard Worker
25*89c4ff92SAndroid Build Coastguard Worker for (int x = bbox.GetX(); x < imageMat.cols; ++x)
26*89c4ff92SAndroid Build Coastguard Worker {
27*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{x, bbox.GetY() + bbox.GetHeight() - 1});
28*89c4ff92SAndroid Build Coastguard Worker }
29*89c4ff92SAndroid Build Coastguard Worker
30*89c4ff92SAndroid Build Coastguard Worker for (int y = bbox.GetY(); y < bbox.GetY() + bbox.GetHeight(); ++y)
31*89c4ff92SAndroid Build Coastguard Worker {
32*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{imageMat.cols - 1, y});
33*89c4ff92SAndroid Build Coastguard Worker }
34*89c4ff92SAndroid Build Coastguard Worker }
35*89c4ff92SAndroid Build Coastguard Worker else if (bbox.GetY() + bbox.GetHeight() > imageMat.rows)
36*89c4ff92SAndroid Build Coastguard Worker {
37*89c4ff92SAndroid Build Coastguard Worker for (int y = bbox.GetY(); y < imageMat.rows; ++y)
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{bbox.GetX(), y});
40*89c4ff92SAndroid Build Coastguard Worker }
41*89c4ff92SAndroid Build Coastguard Worker
42*89c4ff92SAndroid Build Coastguard Worker for (int x = bbox.GetX(); x < bbox.GetX() + bbox.GetWidth(); ++x)
43*89c4ff92SAndroid Build Coastguard Worker {
44*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{x, imageMat.rows - 1});
45*89c4ff92SAndroid Build Coastguard Worker }
46*89c4ff92SAndroid Build Coastguard Worker
47*89c4ff92SAndroid Build Coastguard Worker for (int y = bbox.GetY(); y < imageMat.rows; ++y)
48*89c4ff92SAndroid Build Coastguard Worker {
49*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{bbox.GetX() + bbox.GetWidth() - 1, y});
50*89c4ff92SAndroid Build Coastguard Worker }
51*89c4ff92SAndroid Build Coastguard Worker }
52*89c4ff92SAndroid Build Coastguard Worker else
53*89c4ff92SAndroid Build Coastguard Worker {
54*89c4ff92SAndroid Build Coastguard Worker for (int y = bbox.GetY(); y < bbox.GetY() + bbox.GetHeight(); ++y)
55*89c4ff92SAndroid Build Coastguard Worker {
56*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{bbox.GetX(), y});
57*89c4ff92SAndroid Build Coastguard Worker }
58*89c4ff92SAndroid Build Coastguard Worker
59*89c4ff92SAndroid Build Coastguard Worker for (int x = bbox.GetX(); x < bbox.GetX() + bbox.GetWidth(); ++x)
60*89c4ff92SAndroid Build Coastguard Worker {
61*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{x, bbox.GetY() + bbox.GetHeight() - 1});
62*89c4ff92SAndroid Build Coastguard Worker }
63*89c4ff92SAndroid Build Coastguard Worker
64*89c4ff92SAndroid Build Coastguard Worker for (int y = bbox.GetY(); y < bbox.GetY() + bbox.GetHeight(); ++y)
65*89c4ff92SAndroid Build Coastguard Worker {
66*89c4ff92SAndroid Build Coastguard Worker bboxes.emplace_back(std::tuple<int, int>{bbox.GetX() + bbox.GetWidth() - 1, y});
67*89c4ff92SAndroid Build Coastguard Worker }
68*89c4ff92SAndroid Build Coastguard Worker }
69*89c4ff92SAndroid Build Coastguard Worker }
70*89c4ff92SAndroid Build Coastguard Worker return bboxes;
71*89c4ff92SAndroid Build Coastguard Worker }
72*89c4ff92SAndroid Build Coastguard Worker
GetResourceFilePath(std::string filename)73*89c4ff92SAndroid Build Coastguard Worker static std::string GetResourceFilePath(std::string filename)
74*89c4ff92SAndroid Build Coastguard Worker {
75*89c4ff92SAndroid Build Coastguard Worker std::string testResources = TEST_RESOURCE_DIR;
76*89c4ff92SAndroid Build Coastguard Worker if (0 == testResources.size())
77*89c4ff92SAndroid Build Coastguard Worker {
78*89c4ff92SAndroid Build Coastguard Worker throw "Invalid test resources directory provided";
79*89c4ff92SAndroid Build Coastguard Worker }
80*89c4ff92SAndroid Build Coastguard Worker else
81*89c4ff92SAndroid Build Coastguard Worker {
82*89c4ff92SAndroid Build Coastguard Worker if(testResources.back() != '/')
83*89c4ff92SAndroid Build Coastguard Worker {
84*89c4ff92SAndroid Build Coastguard Worker return testResources + "/" + filename;
85*89c4ff92SAndroid Build Coastguard Worker }
86*89c4ff92SAndroid Build Coastguard Worker else
87*89c4ff92SAndroid Build Coastguard Worker {
88*89c4ff92SAndroid Build Coastguard Worker return testResources + filename;
89*89c4ff92SAndroid Build Coastguard Worker }
90*89c4ff92SAndroid Build Coastguard Worker }
91*89c4ff92SAndroid Build Coastguard Worker }
92*89c4ff92SAndroid Build Coastguard Worker
93*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("Test Adding Inference output to frame")
94*89c4ff92SAndroid Build Coastguard Worker {
95*89c4ff92SAndroid Build Coastguard Worker //todo: re-write test to use static detections
96*89c4ff92SAndroid Build Coastguard Worker
97*89c4ff92SAndroid Build Coastguard Worker std::string testResources = TEST_RESOURCE_DIR;
98*89c4ff92SAndroid Build Coastguard Worker REQUIRE(testResources != "");
99*89c4ff92SAndroid Build Coastguard Worker std::vector<std::tuple<std::string, common::BBoxColor>> labels;
100*89c4ff92SAndroid Build Coastguard Worker
101*89c4ff92SAndroid Build Coastguard Worker common::BBoxColor c
102*89c4ff92SAndroid Build Coastguard Worker {
103*89c4ff92SAndroid Build Coastguard Worker .colorCode = std::make_tuple (0, 0, 255)
104*89c4ff92SAndroid Build Coastguard Worker };
105*89c4ff92SAndroid Build Coastguard Worker
106*89c4ff92SAndroid Build Coastguard Worker auto bboxInfo = std::make_tuple ("person", c);
107*89c4ff92SAndroid Build Coastguard Worker od::BoundingBox bbox(10, 10, 50, 50);
108*89c4ff92SAndroid Build Coastguard Worker od::DetectedObject detection(0, "person", bbox, 0.75);
109*89c4ff92SAndroid Build Coastguard Worker
110*89c4ff92SAndroid Build Coastguard Worker labels.push_back(bboxInfo);
111*89c4ff92SAndroid Build Coastguard Worker
112*89c4ff92SAndroid Build Coastguard Worker od::DetectedObjects detections;
113*89c4ff92SAndroid Build Coastguard Worker cv::Mat frame = cv::imread(GetResourceFilePath("basketball1.png"), cv::IMREAD_COLOR);
114*89c4ff92SAndroid Build Coastguard Worker detections.push_back(detection);
115*89c4ff92SAndroid Build Coastguard Worker
116*89c4ff92SAndroid Build Coastguard Worker AddInferenceOutputToFrame(detections, frame, labels);
117*89c4ff92SAndroid Build Coastguard Worker
118*89c4ff92SAndroid Build Coastguard Worker std::vector<std::tuple<int, int>> bboxes = GetBoundingBoxPoints(detections, frame);
119*89c4ff92SAndroid Build Coastguard Worker
120*89c4ff92SAndroid Build Coastguard Worker // Check that every point is the expected color
121*89c4ff92SAndroid Build Coastguard Worker for(std::tuple<int, int> tuple : bboxes)
122*89c4ff92SAndroid Build Coastguard Worker {
123*89c4ff92SAndroid Build Coastguard Worker cv::Point p(std::get<0>(tuple), std::get<1>(tuple));
124*89c4ff92SAndroid Build Coastguard Worker CHECK(static_cast<int>(frame.at<cv::Vec3b>(p)[0]) == 0);
125*89c4ff92SAndroid Build Coastguard Worker CHECK(static_cast<int>(frame.at<cv::Vec3b>(p)[1]) == 0);
126*89c4ff92SAndroid Build Coastguard Worker CHECK(static_cast<int>(frame.at<cv::Vec3b>(p)[2]) == 255);
127*89c4ff92SAndroid Build Coastguard Worker }
128*89c4ff92SAndroid Build Coastguard Worker }
129