/* * Copyright (c) 2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef IMAGE_UTILS_HPP #define IMAGE_UTILS_HPP #include #include #include #include /* Helper macro to convert RGB888 to RGB565 format. */ #define RGB888_TO_RGB565(R8,G8,B8) ((((R8>>3) & 0x1F) << 11) | \ (((G8>>2) & 0x3F) << 5) | \ ((B8>>3) & 0x1F)) constexpr uint16_t COLOR_BLACK = 0; constexpr uint16_t COLOR_GREEN = RGB888_TO_RGB565( 0, 255, 0); // 2016; constexpr uint16_t COLOR_YELLOW = RGB888_TO_RGB565(255, 255, 0); // 65504; namespace arm { namespace app { namespace image { /** * Contains the x,y co-ordinates of a box centre along with the box width and height. */ struct Box { float x; float y; float w; float h; }; struct Detection { Box bbox; std::vector prob; float objectness; }; /** * @brief Calculate the 1D overlap. * @param[in] x1Center First center point. * @param[in] width1 First width. * @param[in] x2Center Second center point. * @param[in] width2 Second width. * @return The overlap between the two lines. **/ float Calculate1DOverlap(float x1Center, float width1, float x2Center, float width2); /** * @brief Calculate the intersection between the two given boxes. * @param[in] box1 First box. * @param[in] box2 Second box. * @return The intersection value. **/ float CalculateBoxIntersect(Box& box1, Box& box2); /** * @brief Calculate the union between the two given boxes. * @param[in] box1 First box. * @param[in] box2 Second box. * @return The two given boxes union value. **/ float CalculateBoxUnion(Box& box1, Box& box2); /** * @brief Calculate the intersection over union between the two given boxes. * @param[in] box1 First box. * @param[in] box2 Second box. * @return The intersection over union value. **/ float CalculateBoxIOU(Box& box1, Box& box2); /** * @brief Calculate the Non-Maxima suppression on the given detection boxes. * @param[in] detections List of Detection boxes. * @param[in] classes Number of classes. * @param[in] iouThreshold Intersection over union threshold. **/ void CalculateNMS(std::forward_list& detections, int classes, float iouThreshold); /** * @brief Helper function to convert a UINT8 image to INT8 format. * @param[in,out] data Pointer to the data start. * @param[in] kMaxImageSize Total number of pixels in the image. **/ void ConvertImgToInt8(void* data, size_t kMaxImageSize); /** * @brief Converts RGB image to grayscale. * @param[in] srcPtr Pointer to RGB source image. * @param[out] dstPtr Pointer to grayscale destination image. * @param[in] imgSz Destination image size. **/ void RgbToGrayscale(const uint8_t* srcPtr, uint8_t* dstPtr, size_t dstImgSz); } /* namespace image */ } /* namespace app */ } /* namespace arm */ #endif /* IMAGE_UTILS_HPP */