Face Engine SDK
5.25.0
A face detection, recognition and tracking engine.
|
00001 #pragma once 00002 00003 #include <fsdk/Def.h> 00004 #include <fsdk/Types/Format.h> 00005 #include <fsdk/Types/Rect.h> 00006 #include <fsdk/Types/Result.h> 00007 #include <fsdk/Types/RotationType.h> 00008 #include <fsdk/Types/Sizer.h> 00009 #include <fsdk/Types/SubImage.h> 00010 00011 namespace fsdk { 00012 00013 struct IArchive; 00014 00038 struct Image { 00039 00043 enum class Type : uint8_t { 00044 BMP, 00045 JPG, 00046 PNG, 00047 PPM, 00048 TIFF, 00049 Unknown 00050 }; 00051 00055 enum class TargetDevice { 00056 CPU, 00057 GPU, 00058 NPU, 00059 }; 00060 00068 enum class ImageCompression { 00069 IC_NO_COMPRESSION, 00070 IC_SMALL_COMPRESSION, 00071 00072 IC_MEDIUM_COMPRESSION, 00073 IC_HARD_COMPRESSION, 00074 IC_BEST_COMPRESSION, 00075 }; 00079 enum class Error : uint32_t { 00080 Ok, 00081 InvalidWidth, 00082 InvalidHeight, 00083 InvalidDataPtr, 00084 InvalidDataSize, 00085 InvalidImage, 00086 InvalidArchive, 00087 InvalidPath, 00088 InvalidType, 00089 InvalidFormat, 00090 InvalidBitmap, 00091 InvalidMemory, 00092 InvalidConversion, 00093 InvalidResidence, 00094 InvalidDevice, 00095 InvalidCudaKernel, 00096 FailedToSave, 00097 FailedToLoad, 00098 FailedToInitialize, 00099 ReleasedInOtherThread 00100 }; 00101 00107 enum class MemoryResidence : uint32_t { 00108 MemoryCPU, 00109 MemoryGPU, 00110 MemoryNPU, 00111 MemoryNPU_DPP, 00112 }; 00113 00116 FSDK_API Image() noexcept; 00117 00128 FSDK_API Image( 00129 int width, 00130 int height, 00131 Format format, 00132 MemoryResidence residence = MemoryResidence::MemoryCPU, 00133 int deviceId = 0) noexcept; 00134 00147 FSDK_API Image( 00148 int width, 00149 int height, 00150 Format format, 00151 const void* data, 00152 MemoryResidence residence = MemoryResidence::MemoryCPU, 00153 int deviceId = 0) noexcept; 00154 00172 FSDK_API Image( 00173 int width, 00174 int height, 00175 Format format, 00176 void* data, 00177 bool copy, 00178 MemoryResidence residence = MemoryResidence::MemoryCPU, 00179 int deviceId = 0) noexcept; 00180 00185 FSDK_API Image(const Image& other) noexcept; 00186 00191 FSDK_API Image(Image&& other) noexcept; 00192 00198 FSDK_API explicit Image(const SubImage& subImage) noexcept; 00199 00200 FSDK_API ~Image(); 00201 00216 FSDK_API Result<Error> create( 00217 int width, 00218 int height, 00219 Format format, 00220 bool cleanup = true, 00221 MemoryResidence residence = MemoryResidence::MemoryCPU, 00222 int deviceId = 0) noexcept; 00223 00239 FSDK_API Result<Error> create( 00240 int width, 00241 int height, 00242 Format format, 00243 const void* data, 00244 MemoryResidence residence = MemoryResidence::MemoryCPU, 00245 int deviceId = 0) noexcept; 00246 00266 FSDK_API Result<Error> create( 00267 int width, 00268 int height, 00269 Format format, 00270 void* data, 00271 bool copy, 00272 MemoryResidence residence = MemoryResidence::MemoryCPU, 00273 int deviceId = 0) noexcept; 00274 00284 FSDK_API Result<Error> 00285 create(const fsdk::Image& source, MemoryResidence residence, int deviceId = 0) noexcept; 00286 00304 FSDK_API Result<Error> set( 00305 int width, 00306 int height, 00307 Format format, 00308 const void* data, 00309 MemoryResidence residence = MemoryResidence::MemoryCPU, 00310 int deviceId = 0) noexcept; 00311 00333 FSDK_API Result<Error> set( 00334 int width, 00335 int height, 00336 Format format, 00337 void* data, 00338 bool copy, 00339 MemoryResidence residence = MemoryResidence::MemoryCPU, 00340 int deviceId = 0) noexcept; 00341 00347 FSDK_API Result<Error> set(const Image& other) noexcept; 00348 00354 FSDK_API Result<Error> set(const SubImage& subImage) noexcept; 00355 00368 FSDK_API SubImage map(int x, int y, int width, int height) const noexcept; 00369 00377 SubImage map(const Rect& rect) const noexcept { 00378 return map(rect.x, rect.y, rect.width, rect.height); 00379 } 00380 00390 SubImage map(const Size& size) const noexcept { 00391 return map(Point2i(0, 0), size); 00392 } 00393 00402 SubImage map(const Point2i& origin, const Size& size) const noexcept { 00403 return map(origin.x, origin.y, size.x, size.y); 00404 } 00405 00419 FSDK_API Image extract(int x, int y, int width, int height) const noexcept; 00420 00429 Image extract(const Rect& rect) const noexcept { 00430 return extract(rect.x, rect.y, rect.width, rect.height); 00431 } 00432 00443 Image extract(const Size& size) const noexcept { 00444 return extract(Point2i(0, 0), size); 00445 } 00446 00456 Image extract(const Point2i& origin, const Size& size) const noexcept { 00457 return extract(origin.x, origin.y, size.x, size.y); 00458 } 00459 00467 FSDK_API static Result<Error> 00468 guessTypeFromMemory(const void* data, const uint32_t sizeInBytes, Type& type) noexcept; 00469 00475 Image clone() const noexcept { 00476 return {getWidth(), getHeight(), getFormat(), getData(), getMemoryResidence(), getDeviceId()}; 00477 } 00478 00497 FSDK_API Result<Image::Error> convert( 00498 Image& dest, 00499 int x, 00500 int y, 00501 int width, 00502 int height, 00503 Format format, 00504 TargetDevice device = TargetDevice::CPU) const noexcept; 00505 00520 Result<Image::Error> convert( 00521 Image& dest, 00522 const Point2i& origin, 00523 const Size& size, 00524 Format format, 00525 TargetDevice device = TargetDevice::CPU) const noexcept { 00526 return convert(dest, origin.x, origin.y, size.x, size.y, format, device); 00527 } 00528 00544 Result<Image::Error> 00545 convert(Image& dest, const Size& size, Format format, TargetDevice device = TargetDevice::CPU) 00546 const noexcept { 00547 return convert(dest, Point2i(0, 0), size, format, device); 00548 } 00549 00563 Result<Image::Error> 00564 convert(Image& dest, const Rect& rect, Format format, TargetDevice device = TargetDevice::CPU) 00565 const noexcept { 00566 return convert(dest, rect.x, rect.y, rect.width, rect.height, format, device); 00567 } 00568 00579 Result<Image::Error> 00580 convert(Image& dest, Format format, TargetDevice device = TargetDevice::CPU) const noexcept { 00581 return convert(dest, getRect(), format, device); 00582 } 00583 00589 FSDK_API Image rescale(float scale) const noexcept; 00590 00601 FSDK_API Result<Image::Error> save( 00602 const char* path, 00603 fsdk::Image::ImageCompression additionalFlag = 00604 fsdk::Image::ImageCompression::IC_NO_COMPRESSION) const noexcept; 00605 00616 FSDK_API Result<Error> save(const char* path, const Format format) const noexcept; 00617 00628 FSDK_API Result<Image::Error> saveToMemory( 00629 Image::Type type, 00630 IArchive* archive, 00631 fsdk::Image::ImageCompression additionalFlag = 00632 fsdk::Image::ImageCompression::IC_NO_COMPRESSION) const noexcept; 00633 00645 FSDK_API Result<Image::Error> 00646 saveToMemory(Image::Type type, IArchive* archive, const Format format) const noexcept; 00647 00660 FSDK_API Result<Error> load(const char* path) noexcept; 00661 00671 FSDK_API Result<Error> load(const char* path, const Format format) noexcept; 00672 00686 FSDK_API Result<Error> loadFromMemory(const void* data, const uint32_t sizeInBytes) noexcept; 00687 00697 FSDK_API Result<Error> rotate(Image& dest, RotationType rotationType) const noexcept; 00698 00710 FSDK_API Result<Error> 00711 loadFromMemory(const void* data, const uint32_t sizeInBytes, const Format format) noexcept; 00712 00728 FSDK_API Result<Error> 00729 loadFromMemoryOfType(const void* data, const uint32_t sizeInBytes, const Type type) noexcept; 00730 00742 FSDK_API Result<Error> loadFromMemoryOfType( 00743 const void* data, 00744 const uint32_t sizeInBytes, 00745 const Type type, 00746 const Format format) noexcept; 00747 00751 Image& operator=(const Image& other) noexcept { 00752 set(other); 00753 00754 return *this; 00755 } 00756 00760 Image& operator=(Image&& other) noexcept { 00761 if(this != &other) { 00762 release(); 00763 swap(other); 00764 } 00765 00766 return *this; 00767 } 00768 00770 bool isNull() const noexcept { 00771 return getData() == nullptr; 00772 } 00773 00777 bool isValid() const noexcept { 00778 return !isNull() && getHeight() > 0 && getWidth() > 0 && getFormat().isValid(); 00779 } 00780 00784 operator bool() const noexcept { 00785 return isValid(); 00786 } 00787 00792 FSDK_API void* getScanLine(int y) noexcept; 00793 00798 FSDK_API const void* getScanLine(int y) const noexcept; 00799 00802 FSDK_API int getDataSize() const noexcept; 00803 00807 FSDK_API void getDataSize(Sizer& sizer) const noexcept; 00808 00813 template <typename T> 00814 T* getScanLineAs(int y) noexcept { 00815 return reinterpret_cast<T*>(getScanLine(y)); 00816 } 00817 00822 template <typename T> 00823 const T* getScanLineAs(int y) const noexcept { 00824 return reinterpret_cast<const T*>(getScanLine(y)); 00825 } 00826 00829 void* getData() noexcept { 00830 return m_data; 00831 } 00832 00835 const void* getData() const noexcept { 00836 return m_data; 00837 } 00838 00841 template <typename T> 00842 T* getDataAs() noexcept { 00843 return reinterpret_cast<T*>(getData()); 00844 } 00845 00848 template <typename T> 00849 const T* getDataAs() const noexcept { 00850 return reinterpret_cast<const T*>(getData()); 00851 } 00852 00854 int getRowSize() const noexcept { 00855 return getFormat().computePitch(getWidth()); 00856 } 00857 00859 int getWidth() const noexcept { 00860 return m_width; 00861 } 00862 00864 int getHeight() const noexcept { 00865 return m_height; 00866 } 00867 00869 float getAspectRatio() const noexcept { 00870 return static_cast<float>(getWidth()) / static_cast<float>(getHeight()); 00871 } 00872 00874 Format getFormat() const noexcept { 00875 return m_format; 00876 } 00877 00878 MemoryResidence getMemoryResidence() const noexcept { 00879 return m_residence; 00880 } 00881 00882 int getDeviceId() const noexcept { 00883 return m_deviceId; 00884 } 00885 00887 Size getSize() const noexcept { 00888 return Size(getWidth(), getHeight()); 00889 } 00890 00894 Rect getRect() const noexcept { 00895 return Rect(0, 0, getWidth(), getHeight()); 00896 } 00897 00902 bool ownsData() const noexcept { 00903 return !!m_ref; 00904 } 00905 00910 bool isSharedWith(const Image& other) const noexcept { 00911 return getData() == other.getData(); 00912 } 00913 00917 void swap(Image& other) noexcept { 00918 std::swap(m_data, other.m_data); 00919 std::swap(m_ref, other.m_ref); 00920 std::swap(m_height, other.m_height); 00921 std::swap(m_width, other.m_width); 00922 std::swap(m_format, other.m_format); 00923 std::swap(m_residence, other.m_residence); 00924 } 00925 00928 void reset() noexcept { 00929 Image().swap(*this); 00930 } 00931 00937 bool equalWeak(const fsdk::Image& other) const noexcept { 00938 return m_width == other.getWidth() && m_height == other.getHeight() && m_format == other.getFormat() && 00939 m_residence == other.getMemoryResidence(); 00940 } 00941 00947 bool equalStrong(const fsdk::Image& other) const noexcept { 00948 return equalWeak(other) && m_data == other.getData(); 00949 } 00950 00951 FSDK_API void putPixel(uint32_t x, uint32_t y) noexcept; 00952 00953 protected: 00954 void* m_data; 00955 int* m_ref; 00956 int m_height; 00957 int m_width; 00958 int m_deviceId; 00959 Format m_format; 00960 MemoryResidence m_residence; 00961 00966 FSDK_API static void* allocate(int size) noexcept; 00967 00971 FSDK_API static void deallocate(void* memory) noexcept; 00972 00976 FSDK_API int retain() noexcept; 00977 00981 FSDK_API int release() noexcept; 00982 00986 FSDK_API int getRefCount() const noexcept; 00987 }; 00988 00993 const char* toString(Image::MemoryResidence residence); 00994 00998 template <> 00999 struct ErrorTraits<Image::Error> { 01000 01001 static bool isOk(Image::Error error) noexcept { 01002 return error == Image::Error::Ok; 01003 } 01004 01005 static const char* toString(Image::Error error) noexcept { 01006 switch(error) { 01007 case Image::Error::Ok: 01008 return "Ok"; 01009 case Image::Error::InvalidType: 01010 return "Unsupported type"; 01011 case Image::Error::InvalidPath: 01012 return "Invalid path"; 01013 case Image::Error::FailedToSave: 01014 return "Error during image saving"; 01015 case Image::Error::FailedToLoad: 01016 return "Error during image loading"; 01017 case Image::Error::InvalidImage: 01018 return "Invalid image"; 01019 case Image::Error::InvalidWidth: 01020 return "Invalid image width"; 01021 case Image::Error::InvalidHeight: 01022 return "Invalid image height"; 01023 case Image::Error::InvalidFormat: 01024 return "Unsupported format"; 01025 case Image::Error::InvalidMemory: 01026 return "Memory error"; 01027 case Image::Error::InvalidBitmap: 01028 return "Bitmap error"; 01029 case Image::Error::InvalidArchive: 01030 return "Archive error"; 01031 case Image::Error::InvalidDataPtr: 01032 return "Bad input data pointer"; 01033 case Image::Error::InvalidDataSize: 01034 return "Bad input data size"; 01035 case Image::Error::InvalidConversion: 01036 return "Required conversion not implemented"; 01037 case Image::Error::InvalidDevice: 01038 return "Selected Target Device is not supported for this system"; 01039 case Image::Error::FailedToInitialize: 01040 return "Error during initialization"; 01041 case Image::Error::ReleasedInOtherThread: 01042 return "Failed to retain image: it was released in another thread."; 01043 default: 01044 return "Unknown error"; 01045 } 01046 } 01047 }; 01048 01052 using ImageType = Image::Type; 01053 using ImageError = Image::Error; 01054 using TargetDevice = Image::TargetDevice; 01055 using ImageCompression = Image::ImageCompression; 01056 01057 } // namespace fsdk