xref: /aosp_15_r20/external/armnn/samples/ObjectDetection/src/BoundingBox.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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 
6*89c4ff92SAndroid Build Coastguard Worker #include "BoundingBox.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include <algorithm>
8*89c4ff92SAndroid Build Coastguard Worker namespace od
9*89c4ff92SAndroid Build Coastguard Worker {
10*89c4ff92SAndroid Build Coastguard Worker 
BoundingBox()11*89c4ff92SAndroid Build Coastguard Worker BoundingBox::BoundingBox() :
12*89c4ff92SAndroid Build Coastguard Worker         BoundingBox(0, 0, 0u, 0u) {}
13*89c4ff92SAndroid Build Coastguard Worker 
BoundingBox(int x,int y,unsigned int width,unsigned int height)14*89c4ff92SAndroid Build Coastguard Worker BoundingBox::BoundingBox(
15*89c4ff92SAndroid Build Coastguard Worker         int x,
16*89c4ff92SAndroid Build Coastguard Worker         int y,
17*89c4ff92SAndroid Build Coastguard Worker         unsigned int width,
18*89c4ff92SAndroid Build Coastguard Worker         unsigned int height) :
19*89c4ff92SAndroid Build Coastguard Worker         m_X(x),
20*89c4ff92SAndroid Build Coastguard Worker         m_Y(y),
21*89c4ff92SAndroid Build Coastguard Worker         m_Width(width),
22*89c4ff92SAndroid Build Coastguard Worker         m_Height(height) {}
23*89c4ff92SAndroid Build Coastguard Worker 
BoundingBox(const BoundingBox & other)24*89c4ff92SAndroid Build Coastguard Worker BoundingBox::BoundingBox(const BoundingBox& other) :
25*89c4ff92SAndroid Build Coastguard Worker         m_X(other.m_X),
26*89c4ff92SAndroid Build Coastguard Worker         m_Y(other.m_Y),
27*89c4ff92SAndroid Build Coastguard Worker         m_Width(other.m_Width),
28*89c4ff92SAndroid Build Coastguard Worker         m_Height(other.m_Height) {}
29*89c4ff92SAndroid Build Coastguard Worker 
GetX() const30*89c4ff92SAndroid Build Coastguard Worker int BoundingBox::GetX() const {
31*89c4ff92SAndroid Build Coastguard Worker     return m_X;
32*89c4ff92SAndroid Build Coastguard Worker }
33*89c4ff92SAndroid Build Coastguard Worker 
GetY() const34*89c4ff92SAndroid Build Coastguard Worker int BoundingBox::GetY() const {
35*89c4ff92SAndroid Build Coastguard Worker     return m_Y;
36*89c4ff92SAndroid Build Coastguard Worker }
37*89c4ff92SAndroid Build Coastguard Worker 
GetWidth() const38*89c4ff92SAndroid Build Coastguard Worker unsigned int BoundingBox::GetWidth() const {
39*89c4ff92SAndroid Build Coastguard Worker     return m_Width;
40*89c4ff92SAndroid Build Coastguard Worker }
41*89c4ff92SAndroid Build Coastguard Worker 
GetHeight() const42*89c4ff92SAndroid Build Coastguard Worker unsigned int BoundingBox::GetHeight() const {
43*89c4ff92SAndroid Build Coastguard Worker     return m_Height;
44*89c4ff92SAndroid Build Coastguard Worker }
45*89c4ff92SAndroid Build Coastguard Worker 
SetX(int x)46*89c4ff92SAndroid Build Coastguard Worker void BoundingBox::SetX(int x) {
47*89c4ff92SAndroid Build Coastguard Worker     m_X = x;
48*89c4ff92SAndroid Build Coastguard Worker }
49*89c4ff92SAndroid Build Coastguard Worker 
SetY(int y)50*89c4ff92SAndroid Build Coastguard Worker void BoundingBox::SetY(int y) {
51*89c4ff92SAndroid Build Coastguard Worker     m_Y = y;
52*89c4ff92SAndroid Build Coastguard Worker }
53*89c4ff92SAndroid Build Coastguard Worker 
SetWidth(unsigned int width)54*89c4ff92SAndroid Build Coastguard Worker void BoundingBox::SetWidth(unsigned int width) {
55*89c4ff92SAndroid Build Coastguard Worker     m_Width = width;
56*89c4ff92SAndroid Build Coastguard Worker }
57*89c4ff92SAndroid Build Coastguard Worker 
SetHeight(unsigned int height)58*89c4ff92SAndroid Build Coastguard Worker void BoundingBox::SetHeight(unsigned int height) {
59*89c4ff92SAndroid Build Coastguard Worker     m_Height = height;
60*89c4ff92SAndroid Build Coastguard Worker }
61*89c4ff92SAndroid Build Coastguard Worker 
operator =(const BoundingBox & other)62*89c4ff92SAndroid Build Coastguard Worker BoundingBox& BoundingBox::operator=(const BoundingBox& other) {
63*89c4ff92SAndroid Build Coastguard Worker     m_X = other.m_X;
64*89c4ff92SAndroid Build Coastguard Worker     m_Y = other.m_Y;
65*89c4ff92SAndroid Build Coastguard Worker 
66*89c4ff92SAndroid Build Coastguard Worker     m_Width = other.m_Width;
67*89c4ff92SAndroid Build Coastguard Worker     m_Height = other.m_Height;
68*89c4ff92SAndroid Build Coastguard Worker 
69*89c4ff92SAndroid Build Coastguard Worker     return *this;
70*89c4ff92SAndroid Build Coastguard Worker }
71*89c4ff92SAndroid Build Coastguard Worker 
72*89c4ff92SAndroid Build Coastguard Worker /* Helper function to get a "valid" bounding box */
GetValidBoundingBox(const BoundingBox & boxIn,BoundingBox & boxOut,const BoundingBox & boxLimits)73*89c4ff92SAndroid Build Coastguard Worker void GetValidBoundingBox(const BoundingBox& boxIn, BoundingBox& boxOut,
74*89c4ff92SAndroid Build Coastguard Worker                          const BoundingBox& boxLimits) {
75*89c4ff92SAndroid Build Coastguard Worker     boxOut.SetX(std::max(boxIn.GetX(), boxLimits.GetX()));
76*89c4ff92SAndroid Build Coastguard Worker     boxOut.SetY(std::max(boxIn.GetY(), boxLimits.GetY()));
77*89c4ff92SAndroid Build Coastguard Worker 
78*89c4ff92SAndroid Build Coastguard Worker     /* If we have changed x and/or y, we compensate by reducing the height and/or width */
79*89c4ff92SAndroid Build Coastguard Worker     int boxOutWidth = static_cast<int>(boxIn.GetWidth()) -
80*89c4ff92SAndroid Build Coastguard Worker                       std::max(0, (boxOut.GetX() - boxIn.GetX()));
81*89c4ff92SAndroid Build Coastguard Worker     int boxOutHeight = static_cast<int>(boxIn.GetHeight()) -
82*89c4ff92SAndroid Build Coastguard Worker                        std::max(0, (boxOut.GetY() - boxIn.GetY()));
83*89c4ff92SAndroid Build Coastguard Worker 
84*89c4ff92SAndroid Build Coastguard Worker     /* This suggests that there was no overlap on x or/and y axis */
85*89c4ff92SAndroid Build Coastguard Worker     if (boxOutHeight <= 0 || boxOutWidth <= 0)
86*89c4ff92SAndroid Build Coastguard Worker     {
87*89c4ff92SAndroid Build Coastguard Worker         boxOut = BoundingBox{0, 0, 0, 0};
88*89c4ff92SAndroid Build Coastguard Worker         return;
89*89c4ff92SAndroid Build Coastguard Worker     }
90*89c4ff92SAndroid Build Coastguard Worker 
91*89c4ff92SAndroid Build Coastguard Worker     const int limitBoxRightX = boxLimits.GetX() + static_cast<int>(boxLimits.GetWidth());
92*89c4ff92SAndroid Build Coastguard Worker     const int limitBoxRightY = boxLimits.GetY() + static_cast<int>(boxLimits.GetHeight());
93*89c4ff92SAndroid Build Coastguard Worker     const int boxRightX = boxOut.GetX() + boxOutWidth;
94*89c4ff92SAndroid Build Coastguard Worker     const int boxRightY = boxOut.GetY() + boxOutHeight;
95*89c4ff92SAndroid Build Coastguard Worker 
96*89c4ff92SAndroid Build Coastguard Worker     if (boxRightX > limitBoxRightX)
97*89c4ff92SAndroid Build Coastguard Worker     {
98*89c4ff92SAndroid Build Coastguard Worker         boxOutWidth -= (boxRightX - limitBoxRightX);
99*89c4ff92SAndroid Build Coastguard Worker     }
100*89c4ff92SAndroid Build Coastguard Worker 
101*89c4ff92SAndroid Build Coastguard Worker     if (boxRightY > limitBoxRightY)
102*89c4ff92SAndroid Build Coastguard Worker     {
103*89c4ff92SAndroid Build Coastguard Worker         boxOutHeight -= (boxRightY - limitBoxRightY);
104*89c4ff92SAndroid Build Coastguard Worker     }
105*89c4ff92SAndroid Build Coastguard Worker 
106*89c4ff92SAndroid Build Coastguard Worker     /* This suggests value has rolled over because of very high numbers, not handled for now */
107*89c4ff92SAndroid Build Coastguard Worker     if (boxOutHeight <= 0 || boxOutWidth <= 0)
108*89c4ff92SAndroid Build Coastguard Worker     {
109*89c4ff92SAndroid Build Coastguard Worker         boxOut = BoundingBox{0, 0, 0, 0};
110*89c4ff92SAndroid Build Coastguard Worker         return;
111*89c4ff92SAndroid Build Coastguard Worker     }
112*89c4ff92SAndroid Build Coastguard Worker 
113*89c4ff92SAndroid Build Coastguard Worker     boxOut.SetHeight(static_cast<unsigned int>(boxOutHeight));
114*89c4ff92SAndroid Build Coastguard Worker     boxOut.SetWidth(static_cast<unsigned int>(boxOutWidth));
115*89c4ff92SAndroid Build Coastguard Worker }
116*89c4ff92SAndroid Build Coastguard Worker }// namespace od