| /* | |
| * Copyright (c) 2024 EdgeImpulse Inc. | |
| * | |
| * Generated by Edge Impulse and licensed under the applicable Edge Impulse | |
| * Terms of Service. Community and Professional Terms of Service | |
| * (https://edgeimpulse.com/legal/terms-of-service) or Enterprise Terms of | |
| * Service (https://edgeimpulse.com/legal/enterprise-terms-of-service), | |
| * according to your product plan subscription (the “License”). | |
| * | |
| * This software, documentation and other associated files (collectively referred | |
| * to as the “Software”) is a single SDK variation generated by the Edge Impulse | |
| * platform and requires an active paid Edge Impulse subscription to use this | |
| * Software for any purpose. | |
| * | |
| * You may NOT use this Software unless you have an active Edge Impulse subscription | |
| * that meets the eligibility requirements for the applicable License, subject to | |
| * your full and continued compliance with the terms and conditions of the License, | |
| * including without limitation any usage restrictions under the applicable License. | |
| * | |
| * If you do not have an active Edge Impulse product plan subscription, or if use | |
| * of this Software exceeds the usage limitations of your Edge Impulse product plan | |
| * subscription, you are not permitted to use this Software and must immediately | |
| * delete and erase all copies of this Software within your control or possession. | |
| * Edge Impulse reserves all rights and remedies available to enforce its rights. | |
| * | |
| * Unless required by applicable law or agreed to in writing, the Software 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, disclaimers and limitations under the License. | |
| */ | |
| namespace ei { namespace image { namespace processing { | |
| enum YUV_OPTIONS | |
| { | |
| BIG_ENDIAN_ORDER = 1, //RGB reading from low to high memory. Otherwise, uses native encoding | |
| PAD_4B = 2, // pad 0x00 on the high B. ie 0x00RRGGBB | |
| }; | |
| /** | |
| * @brief Convert YUV to RGB | |
| * | |
| * @param rgb_out Output buffer (can be the same as yuv_in if big enough) | |
| * @param yuv_in Input buffer | |
| * @param in_size_B Size of input image in B | |
| * @param opts Note, only BIG_ENDIAN_ORDER supported presently | |
| */ | |
| int yuv422_to_rgb888( | |
| unsigned char *rgb_out, | |
| unsigned const char *yuv_in, | |
| unsigned int in_size_B, | |
| YUV_OPTIONS opts); | |
| /** | |
| * @brief Crops an image. Can be in-place. 4B alignment for best performance | |
| * (Alignment is tested, will fall back to B by B movement) | |
| * | |
| * @param srcWidth X dimension in pixels | |
| * @param srcHeight Y dimension in pixels | |
| * @param srcImage Input buffer | |
| * @param startX X coord of first pixel to keep | |
| * @param startY Y coord of the first pixel to keep | |
| * @param dstWidth Desired X dimension in pixels (should be smaller than srcWidth) | |
| * @param dstHeight Desired Y dimension in pixels (should be smaller than srcHeight) | |
| * @param dstImage Output buffer, can be the same as srcImage | |
| * @param iBpp 8 or 16 for bits per pixel | |
| */ | |
| int cropImage( | |
| const uint8_t *srcImage, | |
| int srcWidth, | |
| int srcHeight, | |
| int startX, | |
| int startY, | |
| uint8_t *dstImage, | |
| int dstWidth, | |
| int dstHeight, | |
| int iBpp); | |
| /** | |
| * @copydoc cropImage( | |
| int srcWidth, | |
| int srcHeight, | |
| const uint8_t *srcImage, | |
| int startX, | |
| int startY, | |
| int dstWidth, | |
| int dstHeight, | |
| uint8_t *dstImage, | |
| int iBpp) | |
| */ | |
| int crop_image_rgb888_packed( | |
| const uint8_t *srcImage, | |
| int srcWidth, | |
| int srcHeight, | |
| int startX, | |
| int startY, | |
| uint8_t *dstImage, | |
| int dstWidth, | |
| int dstHeight); | |
| constexpr int RGB888_B_SIZE = 3; | |
| constexpr int MONO_B_SIZE = 1; | |
| /** | |
| * @brief Resize an image using interpolation | |
| * Can be used to resize the image smaller or larger | |
| * If resizing much smaller than 1/3 size, then a more rubust algorithm should average all of the pixels | |
| * This algorithm uses bilinear interpolation - averages a 2x2 region to generate each new pixel | |
| * | |
| * @param srcWidth Input image width in pixels | |
| * @param srcHeight Input image height in pixels | |
| * @param srcImage Input buffer | |
| * @param dstWidth Output image width in pixels | |
| * @param dstHeight Output image height in pixels | |
| * @param dstImage Output buffer, can be same as input buffer | |
| * @param pixel_size_B Size of pixels in Bytes. 3 for RGB, 1 for mono | |
| */ | |
| int resize_image( | |
| const uint8_t *srcImage, | |
| int srcWidth, | |
| int srcHeight, | |
| uint8_t *dstImage, | |
| int dstWidth, | |
| int dstHeight, | |
| int pixel_size_B); | |
| /** | |
| * @brief Calculate new dims that match the aspect ratio of destination | |
| * This prevents a squashed look | |
| * The smallest axis is held constant | |
| * | |
| * @param srcWidth Input width in pixels | |
| * @param srcHeight Input height in pixels | |
| * @param dstWidth Ultimate width in pixels | |
| * @param dstHeight Ultimate height in pixels | |
| * @param[out] cropWidth Width in pixels that matches the aspect ratio | |
| * @param[out] cropHeight Height in pixels that matches the aspect ratio | |
| */ | |
| void calculate_crop_dims( | |
| int srcWidth, | |
| int srcHeight, | |
| int dstWidth, | |
| int dstHeight, | |
| int &cropWidth, | |
| int &cropHeight); | |
| /** | |
| * @brief Crops, then interpolates to a desired new image size | |
| * Can be done in place (set srcImage == dstImage) | |
| * | |
| * @param srcImage Input image buffer | |
| * @param srcWidth Input width in pixels | |
| * @param srcHeight Input height in pixels | |
| * @param dstImage Output image buffer, can be same as input buffer | |
| * @param dstWidth Desired new width in pixels | |
| * @param dstHeight Desired new height in pixels | |
| */ | |
| int crop_and_interpolate_rgb888( | |
| const uint8_t *srcImage, | |
| int srcWidth, | |
| int srcHeight, | |
| uint8_t *dstImage, | |
| int dstWidth, | |
| int dstHeight); | |
| /** | |
| * @brief Crops, then interpolates to a desired new image size | |
| * Can be done in place (set srcImage == dstImage) | |
| * A more beneric version of the previously used | |
| * crop_and_interpolate_rgb888 | |
| * | |
| * @param srcImage Input image buffer | |
| * @param srcWidth Input width in pixels | |
| * @param srcHeight Input height in pixels | |
| * @param dstImage Output image buffer, can be same as input buffer | |
| * @param dstWidth Desired new width in pixels | |
| * @param dstHeight Desired new height in pixels | |
| * @param pixel_size_B Size of pixels in Bytes. 3 for RGB, 1 for mono | |
| */ | |
| int crop_and_interpolate_image( | |
| const uint8_t *srcImage, | |
| int srcWidth, | |
| int srcHeight, | |
| uint8_t *dstImage, | |
| int dstWidth, | |
| int dstHeight, | |
| int pixel_size_B); | |
| /** | |
| * @brief Resize an image to a new width and height. | |
| * | |
| * @param srcImage Input image buffer | |
| * @param srcWidth Input width in pixels | |
| * @param srcHeight Input height in pixels | |
| * @param dstImage Output image buffer, can be same as input buffer | |
| * @param dstWidth Desired new width in pixels | |
| * @param dstHeight Desired new height in pixels | |
| * @param pixel_size_B Size of pixels in Bytes. 3 for RGB, 1 for mono | |
| * @param mode Resizing mode (FIT_SHORTEST=1, FIT_LONGEST=2, SQUASH=3) | |
| * @return int Status code (0 for success, non-zero for failure) | |
| */ | |
| int resize_image_using_mode( | |
| const uint8_t *srcImage, | |
| int srcWidth, | |
| int srcHeight, | |
| uint8_t *dstImage, | |
| int dstWidth, | |
| int dstHeight, | |
| int pixel_size_B, | |
| int mode); | |
| }}} //namespaces | |