├── .github └── ISSUE_TEMPLATE │ └── bug_report.md ├── CODE_OF_CONDUCT.md ├── Colorizer_iOS.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcshareddata │ └── xcschemes │ │ └── Colorizer_iOS.xcscheme └── xcuserdata │ └── alexander.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── Colorizer_iOS ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── icon_1024.png │ │ ├── icon_120-1.png │ │ ├── icon_120.png │ │ ├── icon_152.png │ │ ├── icon_167.png │ │ ├── icon_180.png │ │ ├── icon_20.png │ │ ├── icon_29.png │ │ ├── icon_40-1.png │ │ ├── icon_40-2.png │ │ ├── icon_40.png │ │ ├── icon_58-1.png │ │ ├── icon_58.png │ │ ├── icon_60.png │ │ ├── icon_76.png │ │ ├── icon_80-1.png │ │ ├── icon_80.png │ │ └── icon_87.png │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Colorizer_iOS-Bridging-Header.h ├── ImageUtils.hpp ├── ImageUtils.mm ├── ImageUtilsWrapper.hpp ├── ImageUtilsWrapper.mm ├── Info.plist ├── SceneDelegate.swift └── ViewController.swift ├── LICENSE ├── README.md ├── colorization_deploy_v2.prototxt └── images ├── QR-kod.png ├── example1_color.png ├── example1_gray.png ├── example2_color.png ├── example2_gray.png ├── example3_color.png ├── example3_gray.png ├── example4_color.png ├── example4_gray.png ├── high_noon.gif ├── interface.png ├── interface_and_photo.png ├── interface_color.png ├── interface_share.png ├── opencv.png ├── opencv1.png ├── opencv2.png └── options.png /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Smartphone (please complete the following information):** 27 | - Device: [e.g. iPhone6] 28 | - Version [e.g. 22] 29 | 30 | **Additional context** 31 | Add any other context about the problem here. 32 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at alex011235dev@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /Colorizer_iOS.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 11C05B1323BA55070039A45D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C05B1223BA55070039A45D /* AppDelegate.swift */; }; 11 | 11C05B1523BA55070039A45D /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C05B1423BA55070039A45D /* SceneDelegate.swift */; }; 12 | 11C05B1723BA55070039A45D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C05B1623BA55070039A45D /* ViewController.swift */; }; 13 | 11C05B1A23BA55070039A45D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 11C05B1823BA55070039A45D /* Main.storyboard */; }; 14 | 11C05B1C23BA550A0039A45D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 11C05B1B23BA550A0039A45D /* Assets.xcassets */; }; 15 | 11C05B1F23BA550A0039A45D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 11C05B1D23BA550A0039A45D /* LaunchScreen.storyboard */; }; 16 | 11C05B2A23BA593E0039A45D /* ImageUtilsWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 11C05B2923BA593E0039A45D /* ImageUtilsWrapper.mm */; }; 17 | 11C05B3023BA59DC0039A45D /* ImageUtils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 11C05B2F23BA59DC0039A45D /* ImageUtils.mm */; }; 18 | 11C05B3423BA5D2B0039A45D /* colorization_deploy_v2.prototxt in Resources */ = {isa = PBXBuildFile; fileRef = 11C05B3223BA5D250039A45D /* colorization_deploy_v2.prototxt */; }; 19 | 11C05B3523BA5D2B0039A45D /* colorization_release_v2.caffemodel in Resources */ = {isa = PBXBuildFile; fileRef = 11C05B3323BA5D2B0039A45D /* colorization_release_v2.caffemodel */; }; 20 | 11C05B4623BB86A50039A45D /* opencv2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 11C05B4523BB86A50039A45D /* opencv2.framework */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | 11C05B0F23BA55070039A45D /* Colorizer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Colorizer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | 11C05B1223BA55070039A45D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 26 | 11C05B1423BA55070039A45D /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 27 | 11C05B1623BA55070039A45D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 28 | 11C05B1923BA55070039A45D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29 | 11C05B1B23BA550A0039A45D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 30 | 11C05B1E23BA550A0039A45D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 31 | 11C05B2023BA550A0039A45D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | 11C05B2823BA593E0039A45D /* Colorizer_iOS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Colorizer_iOS-Bridging-Header.h"; sourceTree = ""; }; 33 | 11C05B2923BA593E0039A45D /* ImageUtilsWrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ImageUtilsWrapper.mm; sourceTree = ""; }; 34 | 11C05B2B23BA597E0039A45D /* ImageUtilsWrapper.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ImageUtilsWrapper.hpp; sourceTree = ""; }; 35 | 11C05B2F23BA59DC0039A45D /* ImageUtils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ImageUtils.mm; sourceTree = ""; }; 36 | 11C05B3123BA59F00039A45D /* ImageUtils.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ImageUtils.hpp; sourceTree = ""; }; 37 | 11C05B3223BA5D250039A45D /* colorization_deploy_v2.prototxt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = colorization_deploy_v2.prototxt; sourceTree = ""; }; 38 | 11C05B3323BA5D2B0039A45D /* colorization_release_v2.caffemodel */ = {isa = PBXFileReference; lastKnownFileType = file; path = colorization_release_v2.caffemodel; sourceTree = ""; }; 39 | 11C05B4523BB86A50039A45D /* opencv2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = opencv2.framework; sourceTree = ""; }; 40 | /* End PBXFileReference section */ 41 | 42 | /* Begin PBXFrameworksBuildPhase section */ 43 | 11C05B0C23BA55070039A45D /* Frameworks */ = { 44 | isa = PBXFrameworksBuildPhase; 45 | buildActionMask = 2147483647; 46 | files = ( 47 | 11C05B4623BB86A50039A45D /* opencv2.framework in Frameworks */, 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | /* End PBXFrameworksBuildPhase section */ 52 | 53 | /* Begin PBXGroup section */ 54 | 11C05B0623BA55070039A45D = { 55 | isa = PBXGroup; 56 | children = ( 57 | 11C05B3223BA5D250039A45D /* colorization_deploy_v2.prototxt */, 58 | 11C05B3323BA5D2B0039A45D /* colorization_release_v2.caffemodel */, 59 | 11C05B1123BA55070039A45D /* Colorizer_iOS */, 60 | 11C05B1023BA55070039A45D /* Products */, 61 | ); 62 | sourceTree = ""; 63 | }; 64 | 11C05B1023BA55070039A45D /* Products */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 11C05B0F23BA55070039A45D /* Colorizer.app */, 68 | ); 69 | name = Products; 70 | sourceTree = ""; 71 | }; 72 | 11C05B1123BA55070039A45D /* Colorizer_iOS */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 11C05B4523BB86A50039A45D /* opencv2.framework */, 76 | 11C05B2823BA593E0039A45D /* Colorizer_iOS-Bridging-Header.h */, 77 | 11C05B1223BA55070039A45D /* AppDelegate.swift */, 78 | 11C05B1B23BA550A0039A45D /* Assets.xcassets */, 79 | 11C05B3123BA59F00039A45D /* ImageUtils.hpp */, 80 | 11C05B2F23BA59DC0039A45D /* ImageUtils.mm */, 81 | 11C05B2B23BA597E0039A45D /* ImageUtilsWrapper.hpp */, 82 | 11C05B2923BA593E0039A45D /* ImageUtilsWrapper.mm */, 83 | 11C05B2023BA550A0039A45D /* Info.plist */, 84 | 11C05B1D23BA550A0039A45D /* LaunchScreen.storyboard */, 85 | 11C05B1823BA55070039A45D /* Main.storyboard */, 86 | 11C05B1423BA55070039A45D /* SceneDelegate.swift */, 87 | 11C05B1623BA55070039A45D /* ViewController.swift */, 88 | ); 89 | path = Colorizer_iOS; 90 | sourceTree = ""; 91 | }; 92 | /* End PBXGroup section */ 93 | 94 | /* Begin PBXNativeTarget section */ 95 | 11C05B0E23BA55070039A45D /* Colorizer_iOS */ = { 96 | isa = PBXNativeTarget; 97 | buildConfigurationList = 11C05B2323BA550A0039A45D /* Build configuration list for PBXNativeTarget "Colorizer_iOS" */; 98 | buildPhases = ( 99 | 11C05B0B23BA55070039A45D /* Sources */, 100 | 11C05B0C23BA55070039A45D /* Frameworks */, 101 | 11C05B0D23BA55070039A45D /* Resources */, 102 | ); 103 | buildRules = ( 104 | ); 105 | dependencies = ( 106 | ); 107 | name = Colorizer_iOS; 108 | productName = Colorizer_iOS; 109 | productReference = 11C05B0F23BA55070039A45D /* Colorizer.app */; 110 | productType = "com.apple.product-type.application"; 111 | }; 112 | /* End PBXNativeTarget section */ 113 | 114 | /* Begin PBXProject section */ 115 | 11C05B0723BA55070039A45D /* Project object */ = { 116 | isa = PBXProject; 117 | attributes = { 118 | LastSwiftUpdateCheck = 1130; 119 | LastUpgradeCheck = 1130; 120 | ORGANIZATIONNAME = "Alexander Karlsson"; 121 | TargetAttributes = { 122 | 11C05B0E23BA55070039A45D = { 123 | CreatedOnToolsVersion = 11.3; 124 | LastSwiftMigration = 1130; 125 | }; 126 | }; 127 | }; 128 | buildConfigurationList = 11C05B0A23BA55070039A45D /* Build configuration list for PBXProject "Colorizer_iOS" */; 129 | compatibilityVersion = "Xcode 9.3"; 130 | developmentRegion = en; 131 | hasScannedForEncodings = 0; 132 | knownRegions = ( 133 | en, 134 | Base, 135 | ); 136 | mainGroup = 11C05B0623BA55070039A45D; 137 | productRefGroup = 11C05B1023BA55070039A45D /* Products */; 138 | projectDirPath = ""; 139 | projectRoot = ""; 140 | targets = ( 141 | 11C05B0E23BA55070039A45D /* Colorizer_iOS */, 142 | ); 143 | }; 144 | /* End PBXProject section */ 145 | 146 | /* Begin PBXResourcesBuildPhase section */ 147 | 11C05B0D23BA55070039A45D /* Resources */ = { 148 | isa = PBXResourcesBuildPhase; 149 | buildActionMask = 2147483647; 150 | files = ( 151 | 11C05B1F23BA550A0039A45D /* LaunchScreen.storyboard in Resources */, 152 | 11C05B3423BA5D2B0039A45D /* colorization_deploy_v2.prototxt in Resources */, 153 | 11C05B3523BA5D2B0039A45D /* colorization_release_v2.caffemodel in Resources */, 154 | 11C05B1C23BA550A0039A45D /* Assets.xcassets in Resources */, 155 | 11C05B1A23BA55070039A45D /* Main.storyboard in Resources */, 156 | ); 157 | runOnlyForDeploymentPostprocessing = 0; 158 | }; 159 | /* End PBXResourcesBuildPhase section */ 160 | 161 | /* Begin PBXSourcesBuildPhase section */ 162 | 11C05B0B23BA55070039A45D /* Sources */ = { 163 | isa = PBXSourcesBuildPhase; 164 | buildActionMask = 2147483647; 165 | files = ( 166 | 11C05B1723BA55070039A45D /* ViewController.swift in Sources */, 167 | 11C05B1323BA55070039A45D /* AppDelegate.swift in Sources */, 168 | 11C05B1523BA55070039A45D /* SceneDelegate.swift in Sources */, 169 | 11C05B3023BA59DC0039A45D /* ImageUtils.mm in Sources */, 170 | 11C05B2A23BA593E0039A45D /* ImageUtilsWrapper.mm in Sources */, 171 | ); 172 | runOnlyForDeploymentPostprocessing = 0; 173 | }; 174 | /* End PBXSourcesBuildPhase section */ 175 | 176 | /* Begin PBXVariantGroup section */ 177 | 11C05B1823BA55070039A45D /* Main.storyboard */ = { 178 | isa = PBXVariantGroup; 179 | children = ( 180 | 11C05B1923BA55070039A45D /* Base */, 181 | ); 182 | name = Main.storyboard; 183 | sourceTree = ""; 184 | }; 185 | 11C05B1D23BA550A0039A45D /* LaunchScreen.storyboard */ = { 186 | isa = PBXVariantGroup; 187 | children = ( 188 | 11C05B1E23BA550A0039A45D /* Base */, 189 | ); 190 | name = LaunchScreen.storyboard; 191 | sourceTree = ""; 192 | }; 193 | /* End PBXVariantGroup section */ 194 | 195 | /* Begin XCBuildConfiguration section */ 196 | 11C05B2123BA550A0039A45D /* Debug */ = { 197 | isa = XCBuildConfiguration; 198 | buildSettings = { 199 | ALWAYS_SEARCH_USER_PATHS = NO; 200 | CLANG_ANALYZER_NONNULL = YES; 201 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 202 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 203 | CLANG_CXX_LIBRARY = "libc++"; 204 | CLANG_ENABLE_MODULES = YES; 205 | CLANG_ENABLE_OBJC_ARC = YES; 206 | CLANG_ENABLE_OBJC_WEAK = YES; 207 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 208 | CLANG_WARN_BOOL_CONVERSION = YES; 209 | CLANG_WARN_COMMA = YES; 210 | CLANG_WARN_CONSTANT_CONVERSION = YES; 211 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 212 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 213 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 214 | CLANG_WARN_EMPTY_BODY = YES; 215 | CLANG_WARN_ENUM_CONVERSION = YES; 216 | CLANG_WARN_INFINITE_RECURSION = YES; 217 | CLANG_WARN_INT_CONVERSION = YES; 218 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 219 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 220 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 221 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 222 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 223 | CLANG_WARN_STRICT_PROTOTYPES = YES; 224 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 225 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 226 | CLANG_WARN_UNREACHABLE_CODE = YES; 227 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 228 | COPY_PHASE_STRIP = NO; 229 | DEBUG_INFORMATION_FORMAT = dwarf; 230 | ENABLE_STRICT_OBJC_MSGSEND = YES; 231 | ENABLE_TESTABILITY = YES; 232 | GCC_C_LANGUAGE_STANDARD = gnu11; 233 | GCC_DYNAMIC_NO_PIC = NO; 234 | GCC_NO_COMMON_BLOCKS = YES; 235 | GCC_OPTIMIZATION_LEVEL = 0; 236 | GCC_PREPROCESSOR_DEFINITIONS = ( 237 | "DEBUG=1", 238 | "$(inherited)", 239 | ); 240 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 241 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 242 | GCC_WARN_UNDECLARED_SELECTOR = YES; 243 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 244 | GCC_WARN_UNUSED_FUNCTION = YES; 245 | GCC_WARN_UNUSED_VARIABLE = YES; 246 | IPHONEOS_DEPLOYMENT_TARGET = 13.2; 247 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 248 | MTL_FAST_MATH = YES; 249 | ONLY_ACTIVE_ARCH = YES; 250 | SDKROOT = iphoneos; 251 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 252 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 253 | }; 254 | name = Debug; 255 | }; 256 | 11C05B2223BA550A0039A45D /* Release */ = { 257 | isa = XCBuildConfiguration; 258 | buildSettings = { 259 | ALWAYS_SEARCH_USER_PATHS = NO; 260 | CLANG_ANALYZER_NONNULL = YES; 261 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 262 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 263 | CLANG_CXX_LIBRARY = "libc++"; 264 | CLANG_ENABLE_MODULES = YES; 265 | CLANG_ENABLE_OBJC_ARC = YES; 266 | CLANG_ENABLE_OBJC_WEAK = YES; 267 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 268 | CLANG_WARN_BOOL_CONVERSION = YES; 269 | CLANG_WARN_COMMA = YES; 270 | CLANG_WARN_CONSTANT_CONVERSION = YES; 271 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 272 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 273 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 274 | CLANG_WARN_EMPTY_BODY = YES; 275 | CLANG_WARN_ENUM_CONVERSION = YES; 276 | CLANG_WARN_INFINITE_RECURSION = YES; 277 | CLANG_WARN_INT_CONVERSION = YES; 278 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 279 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 280 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 281 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 282 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 283 | CLANG_WARN_STRICT_PROTOTYPES = YES; 284 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 285 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 286 | CLANG_WARN_UNREACHABLE_CODE = YES; 287 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 288 | COPY_PHASE_STRIP = NO; 289 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 290 | ENABLE_NS_ASSERTIONS = NO; 291 | ENABLE_STRICT_OBJC_MSGSEND = YES; 292 | GCC_C_LANGUAGE_STANDARD = gnu11; 293 | GCC_NO_COMMON_BLOCKS = YES; 294 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 295 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 296 | GCC_WARN_UNDECLARED_SELECTOR = YES; 297 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 298 | GCC_WARN_UNUSED_FUNCTION = YES; 299 | GCC_WARN_UNUSED_VARIABLE = YES; 300 | IPHONEOS_DEPLOYMENT_TARGET = 13.2; 301 | MTL_ENABLE_DEBUG_INFO = NO; 302 | MTL_FAST_MATH = YES; 303 | SDKROOT = iphoneos; 304 | SWIFT_COMPILATION_MODE = wholemodule; 305 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 306 | VALIDATE_PRODUCT = YES; 307 | }; 308 | name = Release; 309 | }; 310 | 11C05B2423BA550A0039A45D /* Debug */ = { 311 | isa = XCBuildConfiguration; 312 | buildSettings = { 313 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 314 | CLANG_ENABLE_MODULES = YES; 315 | CODE_SIGN_STYLE = Automatic; 316 | DEVELOPMENT_TEAM = DQ7G768LPT; 317 | FRAMEWORK_SEARCH_PATHS = ( 318 | "$(inherited)", 319 | "$(PROJECT_DIR)/Colorizer_iOS", 320 | ); 321 | INFOPLIST_FILE = Colorizer_iOS/Info.plist; 322 | LD_RUNPATH_SEARCH_PATHS = ( 323 | "$(inherited)", 324 | "@executable_path/Frameworks", 325 | ); 326 | PRODUCT_BUNDLE_IDENTIFIER = "com.alex.Colorizer-iOS"; 327 | PRODUCT_NAME = Colorizer; 328 | SWIFT_OBJC_BRIDGING_HEADER = "Colorizer_iOS/Colorizer_iOS-Bridging-Header.h"; 329 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 330 | SWIFT_VERSION = 5.0; 331 | TARGETED_DEVICE_FAMILY = "1,2"; 332 | }; 333 | name = Debug; 334 | }; 335 | 11C05B2523BA550A0039A45D /* Release */ = { 336 | isa = XCBuildConfiguration; 337 | buildSettings = { 338 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 339 | CLANG_ENABLE_MODULES = YES; 340 | CODE_SIGN_STYLE = Automatic; 341 | DEVELOPMENT_TEAM = DQ7G768LPT; 342 | FRAMEWORK_SEARCH_PATHS = ( 343 | "$(inherited)", 344 | "$(PROJECT_DIR)/Colorizer_iOS", 345 | ); 346 | INFOPLIST_FILE = Colorizer_iOS/Info.plist; 347 | LD_RUNPATH_SEARCH_PATHS = ( 348 | "$(inherited)", 349 | "@executable_path/Frameworks", 350 | ); 351 | PRODUCT_BUNDLE_IDENTIFIER = "com.alex.Colorizer-iOS"; 352 | PRODUCT_NAME = Colorizer; 353 | SWIFT_OBJC_BRIDGING_HEADER = "Colorizer_iOS/Colorizer_iOS-Bridging-Header.h"; 354 | SWIFT_VERSION = 5.0; 355 | TARGETED_DEVICE_FAMILY = "1,2"; 356 | }; 357 | name = Release; 358 | }; 359 | /* End XCBuildConfiguration section */ 360 | 361 | /* Begin XCConfigurationList section */ 362 | 11C05B0A23BA55070039A45D /* Build configuration list for PBXProject "Colorizer_iOS" */ = { 363 | isa = XCConfigurationList; 364 | buildConfigurations = ( 365 | 11C05B2123BA550A0039A45D /* Debug */, 366 | 11C05B2223BA550A0039A45D /* Release */, 367 | ); 368 | defaultConfigurationIsVisible = 0; 369 | defaultConfigurationName = Release; 370 | }; 371 | 11C05B2323BA550A0039A45D /* Build configuration list for PBXNativeTarget "Colorizer_iOS" */ = { 372 | isa = XCConfigurationList; 373 | buildConfigurations = ( 374 | 11C05B2423BA550A0039A45D /* Debug */, 375 | 11C05B2523BA550A0039A45D /* Release */, 376 | ); 377 | defaultConfigurationIsVisible = 0; 378 | defaultConfigurationName = Release; 379 | }; 380 | /* End XCConfigurationList section */ 381 | }; 382 | rootObject = 11C05B0723BA55070039A45D /* Project object */; 383 | } 384 | -------------------------------------------------------------------------------- /Colorizer_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Colorizer_iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Colorizer_iOS.xcodeproj/xcshareddata/xcschemes/Colorizer_iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /Colorizer_iOS.xcodeproj/xcuserdata/alexander.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /Colorizer_iOS.xcodeproj/xcuserdata/alexander.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Colorizer_iOS.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 11C05B0E23BA55070039A45D 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Colorizer_iOS/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Colorizer_iOS 4 | // 5 | // Created by Alexander Karlsson on 2019-12-30. 6 | // Copyright © 2019 Alexander Karlsson. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "icon_40.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "icon_60.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "icon_58.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "icon_87.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "icon_80.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "icon_120.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "icon_120-1.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "icon_180.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "20x20", 53 | "idiom" : "ipad", 54 | "filename" : "icon_20.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "icon_40-1.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "29x29", 65 | "idiom" : "ipad", 66 | "filename" : "icon_29.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "icon_58-1.png", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "40x40", 77 | "idiom" : "ipad", 78 | "filename" : "icon_40-2.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "icon_80-1.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "76x76", 89 | "idiom" : "ipad", 90 | "filename" : "icon_76.png", 91 | "scale" : "1x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "icon_152.png", 97 | "scale" : "2x" 98 | }, 99 | { 100 | "size" : "83.5x83.5", 101 | "idiom" : "ipad", 102 | "filename" : "icon_167.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "1024x1024", 107 | "idiom" : "ios-marketing", 108 | "filename" : "icon_1024.png", 109 | "scale" : "1x" 110 | } 111 | ], 112 | "info" : { 113 | "version" : 1, 114 | "author" : "xcode" 115 | } 116 | } -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_1024.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_120-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_120-1.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_120.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_152.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_167.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_180.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_20.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_29.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_40-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_40-1.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_40-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_40-2.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_40.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_58-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_58-1.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_58.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_60.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_76.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_80-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_80-1.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_80.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/Colorizer_iOS/Assets.xcassets/AppIcon.appiconset/icon_87.png -------------------------------------------------------------------------------- /Colorizer_iOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Colorizer_iOS/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Colorizer_iOS/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 75 | 80 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /Colorizer_iOS/Colorizer_iOS-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "ImageUtilsWrapper.hpp" 6 | -------------------------------------------------------------------------------- /Colorizer_iOS/ImageUtils.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // ImageUtils.hpp 3 | // Colorizer_iOS 4 | // 5 | // Created by Alexander Karlsson on 2019-12-30. 6 | // Copyright © 2019 Alexander Karlsson. All rights reserved. 7 | // 8 | 9 | #ifndef ImageUtils_h 10 | #define ImageUtils_h 11 | 12 | #import 13 | #import 14 | #import 15 | 16 | #import 17 | 18 | @interface ImageUtils : NSObject { 19 | cv::Mat mat; 20 | } 21 | 22 | /** 23 | \brief Converts a single grayscale image to a color image. 24 | \link https://docs.opencv.org/3.4/d6/d39/samples_2dnn_2colorization_8cpp-example.html 25 | \return A colorized image. 26 | */ 27 | -(UIImage*)colorize; 28 | 29 | /** 30 | \brief Sets the the image to use when converting a single grayscale image. 31 | \param[in] img A grayscale image. 32 | */ 33 | -(void)setImg:(UIImage*) img; 34 | 35 | @end 36 | 37 | #endif /* ImageUtils_h */ 38 | -------------------------------------------------------------------------------- /Colorizer_iOS/ImageUtils.mm: -------------------------------------------------------------------------------- 1 | // 2 | // ImageUtils.m 3 | // Colorizer_iOS 4 | // 5 | // Created by Alexander Karlsson on 2019-12-30. 6 | // Copyright © 2019 Alexander Karlsson. All rights reserved. 7 | // 8 | 9 | #import "ImageUtils.hpp" 10 | 11 | #import 12 | 13 | #import 14 | #import 15 | #import 16 | 17 | using namespace cv; 18 | using namespace cv::dnn; 19 | 20 | namespace { 21 | 22 | static float hull_pts[] = { 23 | -90., -90., -90., -90., -90., -80., -80., -80., -80., -80., -80., -80., -80., -70., -70., -70., -70., -70., -70., -70., -70., 24 | -70., -70., -60., -60., -60., -60., -60., -60., -60., -60., -60., -60., -60., -60., -50., -50., -50., -50., -50., -50., -50., -50., 25 | -50., -50., -50., -50., -50., -50., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -30., 26 | -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -20., -20., -20., -20., -20., -20., -20., 27 | -20., -20., -20., -20., -20., -20., -20., -20., -20., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., 28 | -10., -10., -10., -10., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 10., 10., 10., 10., 10., 10., 10., 29 | 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 30 | 20., 20., 20., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 40., 40., 40., 40., 31 | 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 32 | 50., 50., 50., 50., 50., 50., 50., 50., 50., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 33 | 60., 60., 60., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 80., 80., 80., 34 | 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 35 | 90., 90., 90., 90., 90., 90., 90., 90., 90., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 50., 60., 70., 80., 90., 36 | 20., 30., 40., 50., 60., 70., 80., 90., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -20., -10., 0., 10., 20., 30., 40., 50., 37 | 60., 70., 80., 90., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -40., -30., -20., -10., 0., 10., 20., 38 | 30., 40., 50., 60., 70., 80., 90., 100., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -50., 39 | -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -60., -50., -40., -30., -20., -10., 0., 10., 20., 40 | 30., 40., 50., 60., 70., 80., 90., 100., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 41 | 100., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -80., -70., -60., -50., 42 | -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -90., -80., -70., -60., -50., -40., -30., -20., -10., 43 | 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 44 | 40., 50., 60., 70., 80., 90., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 45 | 80., -110., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., -110., -100., 46 | -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., -110., -100., -90., -80., -70., 47 | -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., -110., -100., -90., -80., -70., -60., -50., -40., -30., 48 | -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0.}; 49 | 50 | } 51 | 52 | @implementation ImageUtils { 53 | Net net; 54 | } 55 | 56 | -(id)init { 57 | if ( self = [super init] ) { 58 | // Define what files to read 59 | NSString *protoFileName = [[NSBundle mainBundle] pathForResource:@"colorization_deploy_v2" ofType:@"prototxt"]; 60 | const char* protoCString = [protoFileName UTF8String]; 61 | 62 | NSString *modelFileName = [[NSBundle mainBundle] pathForResource:@"colorization_release_v2" ofType:@"caffemodel"]; 63 | const char* modelFileNameCString = [modelFileName UTF8String]; 64 | 65 | std::string modelTxt = std::string(protoCString); 66 | std::string modelBin = std::string(modelFileNameCString); 67 | 68 | // Initialize net 69 | net = readNetFromCaffe(modelTxt, modelBin); 70 | net.setPreferableTarget(cv::dnn::DNN_TARGET_OPENCL); 71 | } 72 | 73 | return self; 74 | } 75 | 76 | -(void)setImg:(UIImage*) img { 77 | UIImageToMat(img, mat); 78 | 79 | // Check if image is grayscale or "grayscale" (actually color), and convert to BGR. 80 | if (mat.channels() == 1) { 81 | cv::cvtColor(mat, mat, CV_GRAY2BGR); 82 | } else if (mat.channels() == 4) { 83 | cv::cvtColor(mat, mat, CV_BGRA2BGR); 84 | } 85 | } 86 | 87 | - (UIImage *)colorize { 88 | // fixed input size for the pretrained network 89 | const int W_in = 224; 90 | const int H_in = 224; 91 | 92 | // setup additional layers: 93 | int sz[] = {2, 313, 1, 1}; 94 | cv::Mat pts_in_hull(4, sz, CV_32F, hull_pts); 95 | cv::Ptr class8_ab = net.getLayer("class8_ab"); 96 | class8_ab->blobs.push_back(pts_in_hull); 97 | cv::Ptr conv8_313_rh = net.getLayer("conv8_313_rh"); 98 | conv8_313_rh->blobs.push_back(Mat(1, 313, CV_32F, Scalar(2.606))); 99 | 100 | // extract L channel and subtract mean 101 | cv::Mat lab, L, input; 102 | mat.convertTo(mat, CV_32F, 1.0 / 255); 103 | cv::cvtColor(mat, lab, COLOR_BGR2Lab); 104 | cv::extractChannel(lab, L, 0); 105 | cv::resize(L, input, cv::Size(W_in, H_in)); 106 | input -= 50; 107 | 108 | // run the L channel through the network 109 | cv::Mat inputBlob = blobFromImage(input); 110 | net.setInput(inputBlob); 111 | cv::Mat result = net.forward(); 112 | 113 | // retrieve the calculated a,b channels from the network output 114 | cv::Size siz(result.size[2], result.size[3]); 115 | cv::Mat a = Mat(siz, CV_32F, result.ptr(0, 0)); 116 | cv::Mat b = Mat(siz, CV_32F, result.ptr(0, 1)); 117 | cv::resize(a, a, mat.size()); 118 | cv::resize(b, b, mat.size()); 119 | 120 | // merge, and convert back to RGB 121 | cv::Mat color, chn[] = {L, a, b}; 122 | cv::merge(chn, 3, lab); 123 | cv::cvtColor(lab, color, COLOR_Lab2RGB); 124 | 125 | color.convertTo(color, CV_8UC4, 255); 126 | 127 | return MatToUIImage(color); 128 | } 129 | 130 | @end 131 | -------------------------------------------------------------------------------- /Colorizer_iOS/ImageUtilsWrapper.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // ImageUtilsWrapper.hpp 3 | // Colorizer_iOS 4 | // 5 | // Created by Alexander Karlsson on 2019-12-30. 6 | // Copyright © 2019 Alexander Karlsson. All rights reserved. 7 | // 8 | 9 | #ifndef ImageUtilsWrapper_h 10 | #define ImageUtilsWrapper_h 11 | 12 | #import 13 | #import 14 | 15 | @interface ImageUtilsWrapper : NSObject 16 | 17 | /** 18 | \brief Converts a grayscale image to color. 19 | \return A colorized image. 20 | */ 21 | -(UIImage*)colorizeImage:(UIImage*)img; 22 | 23 | @end 24 | 25 | #endif /* ImageUtilsWrapper_h */ 26 | -------------------------------------------------------------------------------- /Colorizer_iOS/ImageUtilsWrapper.mm: -------------------------------------------------------------------------------- 1 | // 2 | // ImageUtilsWrapper.m 3 | // Colorizer_iOS 4 | // 5 | // Created by Alexander Karlsson on 2019-12-30. 6 | // Copyright © 2019 Alexander Karlsson. All rights reserved. 7 | // 8 | 9 | #import "ImageUtilsWrapper.hpp" 10 | #import "ImageUtils.hpp" 11 | 12 | #import 13 | #import 14 | #import 15 | 16 | @implementation ImageUtilsWrapper 17 | 18 | ImageUtils *im_utils; 19 | 20 | -(id)init { 21 | im_utils = [[ImageUtils alloc] init]; 22 | return self; 23 | } 24 | 25 | - (UIImage *)colorizeImage:(UIImage *)img { 26 | [im_utils setImg:img]; 27 | UIImage *color = [im_utils colorize]; 28 | return color; 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Colorizer_iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSPhotoLibraryAddUsageDescription 6 | $(PRODUCT_NAME) would like to access your photo library. 7 | NSPhotoLibraryUsageDescription 8 | $(PRODUCT_NAME) would like to access your photo library. 9 | CFBundleDevelopmentRegion 10 | $(DEVELOPMENT_LANGUAGE) 11 | CFBundleExecutable 12 | $(EXECUTABLE_NAME) 13 | CFBundleIdentifier 14 | $(PRODUCT_BUNDLE_IDENTIFIER) 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | $(PRODUCT_NAME) 19 | CFBundlePackageType 20 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 21 | CFBundleShortVersionString 22 | 1.0 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | UIApplicationSceneManifest 28 | 29 | UIApplicationSupportsMultipleScenes 30 | 31 | UISceneConfigurations 32 | 33 | UIWindowSceneSessionRoleApplication 34 | 35 | 36 | UISceneConfigurationName 37 | Default Configuration 38 | UISceneDelegateClassName 39 | $(PRODUCT_MODULE_NAME).SceneDelegate 40 | UISceneStoryboardFile 41 | Main 42 | 43 | 44 | 45 | 46 | UILaunchStoryboardName 47 | LaunchScreen 48 | UIMainStoryboardFile 49 | Main 50 | UIRequiredDeviceCapabilities 51 | 52 | armv7 53 | 54 | UISupportedInterfaceOrientations 55 | 56 | UIInterfaceOrientationPortrait 57 | UIInterfaceOrientationLandscapeLeft 58 | UIInterfaceOrientationLandscapeRight 59 | 60 | UISupportedInterfaceOrientations~ipad 61 | 62 | UIInterfaceOrientationPortrait 63 | UIInterfaceOrientationPortraitUpsideDown 64 | UIInterfaceOrientationLandscapeLeft 65 | UIInterfaceOrientationLandscapeRight 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /Colorizer_iOS/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // Colorizer_iOS 4 | // 5 | // Created by Alexander Karlsson on 2019-12-30. 6 | // Copyright © 2019 Alexander Karlsson. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 20 | guard let _ = (scene as? UIWindowScene) else { return } 21 | } 22 | 23 | func sceneDidDisconnect(_ scene: UIScene) { 24 | // Called as the scene is being released by the system. 25 | // This occurs shortly after the scene enters the background, or when its session is discarded. 26 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 27 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 28 | } 29 | 30 | func sceneDidBecomeActive(_ scene: UIScene) { 31 | // Called when the scene has moved from an inactive state to an active state. 32 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 33 | } 34 | 35 | func sceneWillResignActive(_ scene: UIScene) { 36 | // Called when the scene will move from an active state to an inactive state. 37 | // This may occur due to temporary interruptions (ex. an incoming phone call). 38 | } 39 | 40 | func sceneWillEnterForeground(_ scene: UIScene) { 41 | // Called as the scene transitions from the background to the foreground. 42 | // Use this method to undo the changes made on entering the background. 43 | } 44 | 45 | func sceneDidEnterBackground(_ scene: UIScene) { 46 | // Called as the scene transitions from the foreground to the background. 47 | // Use this method to save data, release shared resources, and store enough scene-specific state information 48 | // to restore the scene back to its current state. 49 | } 50 | 51 | 52 | } 53 | 54 | -------------------------------------------------------------------------------- /Colorizer_iOS/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Colorizer_iOS 4 | // 5 | // Created by Alexander Karlsson on 2019-12-30. 6 | // Copyright © 2019 Alexander Karlsson. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MobileCoreServices 11 | import AVFoundation 12 | import AVKit 13 | 14 | class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 15 | 16 | @IBOutlet weak var imageView: UIImageView! 17 | @IBOutlet weak var colorizeButton: UIBarButtonItem! 18 | @IBOutlet weak var segment: UISegmentedControl! 19 | @IBOutlet weak var actionButton: UIBarButtonItem! 20 | @IBOutlet weak var playButton: UIBarButtonItem! 21 | @IBOutlet weak var movieBar: UIToolbar! 22 | @IBOutlet weak var progressView: UIProgressView! 23 | @IBOutlet weak var statusLabel: UILabel! 24 | 25 | var imageColor: UIImage! 26 | var imageGray: UIImage! 27 | var movieUrl: URL! 28 | var movieSelected = false 29 | var playerLayer: AVPlayerViewController! 30 | var frames:[UIImage]! 31 | var generator:AVAssetImageGenerator! 32 | var duration: Float64! 33 | var frameRate = 1.0 34 | let colorizer = ImageUtilsWrapper(); 35 | 36 | override func viewDidLoad() { 37 | super.viewDidLoad() 38 | // Do any additional setup after loading the view. 39 | } 40 | 41 | /** 42 | Reacts when user taps on the screen, this will trigger opening the camera roll. 43 | - parameter sender: Any 44 | */ 45 | @IBAction func onTap(_ sender: Any) { 46 | if UIImagePickerController.isSourceTypeAvailable( 47 | UIImagePickerController.SourceType.savedPhotosAlbum) { 48 | let imagePicker = UIImagePickerController() 49 | 50 | imagePicker.delegate = self 51 | imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary 52 | imagePicker.mediaTypes = [kUTTypeImage as String, kUTTypeMovie as String] 53 | imagePicker.allowsEditing = false 54 | self.present(imagePicker, animated: true, completion: nil) 55 | } 56 | } 57 | 58 | /** 59 | Reacts when the arrow-button is pressed. This will call functions (in Objectiv-C++) to colorize the chose image. 60 | - parameter sender: UIBarButtonItem 61 | */ 62 | @IBAction func onColorizeSwap(_ sender: UIBarButtonItem) { 63 | 64 | if self.movieSelected { 65 | self.progressView.setProgress(0.0, animated: false) 66 | self.progressView.isHidden = false 67 | self.statusLabel.isHidden = false 68 | 69 | self.getAllFrames() 70 | var progress:Float = 0 71 | let total = Float(frames.count) 72 | var counter = 0 73 | var colorImages = [UIImage]() 74 | 75 | let timer = Timer(timeInterval: 0.1, repeats: true) { 76 | (timer) in 77 | 78 | if progress < total { 79 | progress += 1.0 80 | self.progressView.setProgress(progress / total, animated: true) 81 | 82 | let im = self.frames[counter] 83 | let colorIm = self.colorizer.colorizeImage(im) 84 | colorImages.append(colorIm!) 85 | 86 | counter += 1 87 | 88 | } else { 89 | timer.invalidate() 90 | 91 | self.imageView.animationImages = colorImages 92 | self.imageView.animationDuration = self.duration 93 | self.imageView.animationRepeatCount = 1 94 | self.imageView.image = self.imageView.animationImages?.first 95 | self.playButton.isEnabled = true 96 | self.actionButton.isEnabled = false 97 | self.colorizeButton.isEnabled = false 98 | self.progressView.isHidden = true 99 | self.statusLabel.isHidden = true 100 | } 101 | } 102 | 103 | RunLoop.main.add(timer, forMode: .default) 104 | 105 | } else { 106 | let image:UIImage = imageView.image! 107 | let colorIm = colorizer.colorizeImage(image) 108 | 109 | self.imageView.image = colorIm; 110 | self.imageColor = colorIm 111 | 112 | self.segment.isEnabled = true 113 | self.segment.isHidden = false 114 | self.actionButton.isEnabled = true 115 | self.colorizeButton.isEnabled = false 116 | } 117 | } 118 | 119 | /** 120 | Goes between the colorized image and the grayscale input image, to compare. 121 | - parameter sender: UISegmentedControl 122 | */ 123 | @IBAction func onSegmentChange(_ sender: UISegmentedControl) { 124 | if sender.selectedSegmentIndex == 0 { 125 | imageView.image = imageColor 126 | actionButton.isEnabled = true 127 | } else if sender.selectedSegmentIndex == 1 { 128 | imageView.image = imageGray 129 | actionButton.isEnabled = false 130 | } 131 | } 132 | 133 | /** 134 | Changes the frame rate when the stepper value is changed. Happens when the stepper is tapped + or -. 135 | - parameter sender: UIStepper 136 | */ 137 | @IBAction func onStepperValueChange(_ sender: UIStepper) { 138 | let stepperValue = Int(sender.value) 139 | let stepperValueStr = String(stepperValue) 140 | let title = "New animation frame rate: " + stepperValueStr 141 | let message = "Using a higher frame rate will take longer time to generate animation." 142 | self.playButton.isEnabled = false 143 | self.colorizeButton.isEnabled = true 144 | self.frameRate = 1.0 / sender.value 145 | 146 | let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 147 | 148 | self.present(alert, animated: true, completion: nil) 149 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.75) { 150 | alert.dismiss(animated: true, completion: nil) 151 | } 152 | } 153 | 154 | /** 155 | Reacts when the action button is pressed, this whill open the "share" menu where the user can chose to e.g. save the result. 156 | - parameter sender: UIBarButtonItem 157 | */ 158 | @IBAction func onActionButtonPressed(_ sender: UIBarButtonItem) { 159 | if let image = imageColor { 160 | let vc = UIActivityViewController(activityItems: [image], applicationActivities: []) 161 | present(vc, animated: true) 162 | } 163 | } 164 | 165 | /** 166 | Starts playing the animation. 167 | - parameter sender: UIBarButtonItem 168 | */ 169 | @IBAction func onPlayMovie(_ sender: Any) { 170 | if movieSelected { 171 | imageView.startAnimating() 172 | } 173 | } 174 | 175 | /** 176 | Opens the camera roll and gets the selected image. 177 | - parameter picker: UIImagePickerController 178 | */ 179 | func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 180 | 181 | let mediaType = info[UIImagePickerController.InfoKey.mediaType] as! NSString 182 | 183 | if mediaType.isEqual(to: kUTTypeImage as String) { 184 | let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage 185 | self.dismiss(animated: true, completion: nil) 186 | self.imageView.contentMode = .scaleAspectFill 187 | self.imageView.image = image 188 | 189 | self.movieBar.isHidden = true 190 | self.movieSelected = false 191 | 192 | self.imageGray = image 193 | 194 | self.segment.isHidden = true 195 | self.segment.isEnabled = false 196 | self.actionButton.isEnabled = false 197 | 198 | } else if mediaType.isEqual(to: kUTTypeMovie as String) { 199 | self.imageView.image = nil 200 | self.imageView.contentMode = .scaleAspectFit 201 | 202 | self.movieBar.isHidden = false 203 | self.movieSelected = true 204 | self.playButton.isEnabled = false 205 | 206 | self.movieUrl = info[UIImagePickerController.InfoKey.mediaURL] as? URL 207 | 208 | } 209 | colorizeButton.isEnabled = true 210 | } 211 | 212 | /** 213 | Listens for dismiss of camera roll. 214 | - parameter picker: UIImagePickerController 215 | */ 216 | func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 217 | self.dismiss(animated: true, completion: nil) 218 | } 219 | 220 | 221 | // https://stackoverflow.com/questions/42665271/swift-get-all-frames-from-video 222 | func getAllFrames() { 223 | let asset:AVAsset = AVAsset(url: movieUrl) 224 | self.duration = CMTimeGetSeconds(asset.duration) 225 | 226 | self.generator = AVAssetImageGenerator(asset:asset) 227 | self.generator.appliesPreferredTrackTransform = true 228 | self.frames = [] 229 | 230 | for index in stride(from: 0, to: self.duration, by: self.frameRate) { 231 | self.getFrame(fromTime:Float64(index)) 232 | } 233 | 234 | self.generator = nil 235 | } 236 | 237 | // https://stackoverflow.com/questions/42665271/swift-get-all-frames-from-video 238 | private func getFrame(fromTime:Float64) { 239 | let time:CMTime = CMTimeMakeWithSeconds(fromTime, preferredTimescale:600) 240 | let image:CGImage 241 | do { 242 | try image = self.generator.copyCGImage(at:time, actualTime:nil) 243 | } catch { 244 | return 245 | } 246 | self.frames.append(UIImage(cgImage:image)) 247 | } 248 | 249 | } 250 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2019, Alexander Karlsson 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](code-of-conduct.md) 2 | 3 | Colorizer iOS 4 | =============== 5 | 6 | This is a project for adding color to black-and-white photos and animations. "Colorizer" is a tool that can process black-and-white media and add color to them. The colorizer tool is an app made in Swift and Objective-C++ for iOS devices. It's a rather simple thing to convert color photos to grayscale photos, but to do reverse process needs more sophisticated techniques. In this project, a pre-trained Convolutional-Neural-Network (CNN) model is used to go from grayscale to color photos. 7 | 8 |

9 | 10 | 11 |

12 | 13 | ## Background 14 | This project is partly based on the OpenCV example found [here](https://docs.opencv.org/3.4/d6/d39/samples_2dnn_2colorization_8cpp-example.html). 15 | 16 | The example is based on a University of Berkeley research project where Zhang et al. trained a CNN model for converting grayscale images to color images. The model was trained using the Caffe framework, which output models the OpenCV framework can handle. 17 | 18 | For more information, please visit the research [webpage](http://richzhang.github.io/colorization/) and this Bibtex: 19 | 20 | ``` 21 | @inproceedings{zhang2016colorful, 22 | title={Colorful Image Colorization}, 23 | author={Zhang, Richard and Isola, Phillip and Efros, Alexei A}, 24 | booktitle={ECCV}, 25 | year={2016} 26 | } 27 | ``` 28 | 29 | A little tweaking of the example code was needed to make it compatible for iOS devices. The user interface is made in Swift and Apple's design tools in Xcode. 30 | 31 | ## Dependencies 32 | The app cannot run without OpenCV. Luckily, there's a OpenCV module for iOS. However, the module is too large for Git so you need to download it from [here](https://opencv.org/releases/). Download a module of version 3.4.9 or higher. After downloading the package, unzip it and place it inside the Xcode project, see the pictures below. 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | Finally, the Caffe-model files have to be downloaded from [this link](https://www.icloud.com/iclouddrive/0N0bxC_gCVqD4vgyLkAtL-w6Q#models). Unzip the downloaded file and copy `colorization_release_v2.caffemodel` and `colorization_deploy_v2.prototxt` and put them in the root of `Colorizer-iOS` in Xcode, choose "Copy items if needed" and "Add to targets -> Colorizer_iOS". Now, the project should be ready to run. 41 | 42 | 43 | 44 | ## Interface 45 | 46 | ### Main interface 47 | Tap on the screen to open the camera roll and choose a photo. The arrow becomes green and the photo can now be colorized. A colorized image will be shown and the share button becomes green, the image can now be saved. To compare the result and the input, there is a segment button go go between these. 48 | 49 |

50 | 51 | 52 |

53 |

54 | 55 | 56 |

57 | 58 | 59 | ## Examples 60 | 61 |

62 | 63 | 64 |

65 | 66 |

67 | 68 | 69 |

70 | 71 |

72 | 73 | 74 |

75 | 76 | ## Animations 77 | The app can take black-and-white films and make an animations by sampling images from the movie. Since it takes a long time to convert a batch of grayscale images to color images, it's not recommended to choose too big films. The example below took approximately 17 s. to generate, the original film is 13 s long. 52 frames were sampled, which means that every frame takes around 0.33 s to compute when using the Xcode iPhone emulator. 78 | 79 | 80 | 81 | ## Future work 82 | * Improve animations. 83 | * Speed up computations to generate animations faster. 84 | 85 | ## Donations 86 | 87 | Paypal 88 | 89 | ![Paypal](images/QR-kod.png) 90 | -------------------------------------------------------------------------------- /colorization_deploy_v2.prototxt: -------------------------------------------------------------------------------- 1 | name: "LtoAB" 2 | 3 | layer { 4 | name: "data_l" 5 | type: "Input" 6 | top: "data_l" 7 | input_param { 8 | shape { dim: 1 dim: 1 dim: 224 dim: 224 } 9 | } 10 | } 11 | 12 | # ***************** 13 | # ***** conv1 ***** 14 | # ***************** 15 | layer { 16 | name: "bw_conv1_1" 17 | type: "Convolution" 18 | bottom: "data_l" 19 | top: "conv1_1" 20 | # param {lr_mult: 0 decay_mult: 0} 21 | # param {lr_mult: 0 decay_mult: 0} 22 | convolution_param { 23 | num_output: 64 24 | pad: 1 25 | kernel_size: 3 26 | } 27 | } 28 | layer { 29 | name: "relu1_1" 30 | type: "ReLU" 31 | bottom: "conv1_1" 32 | top: "conv1_1" 33 | } 34 | layer { 35 | name: "conv1_2" 36 | type: "Convolution" 37 | bottom: "conv1_1" 38 | top: "conv1_2" 39 | # param {lr_mult: 0 decay_mult: 0} 40 | # param {lr_mult: 0 decay_mult: 0} 41 | convolution_param { 42 | num_output: 64 43 | pad: 1 44 | kernel_size: 3 45 | stride: 2 46 | } 47 | } 48 | layer { 49 | name: "relu1_2" 50 | type: "ReLU" 51 | bottom: "conv1_2" 52 | top: "conv1_2" 53 | } 54 | layer { 55 | name: "conv1_2norm" 56 | type: "BatchNorm" 57 | bottom: "conv1_2" 58 | top: "conv1_2norm" 59 | batch_norm_param{ } 60 | param {lr_mult: 0 decay_mult: 0} 61 | param {lr_mult: 0 decay_mult: 0} 62 | param {lr_mult: 0 decay_mult: 0} 63 | } 64 | # ***************** 65 | # ***** conv2 ***** 66 | # ***************** 67 | layer { 68 | name: "conv2_1" 69 | type: "Convolution" 70 | # bottom: "conv1_2" 71 | bottom: "conv1_2norm" 72 | # bottom: "pool1" 73 | top: "conv2_1" 74 | # param {lr_mult: 0 decay_mult: 0} 75 | # param {lr_mult: 0 decay_mult: 0} 76 | convolution_param { 77 | num_output: 128 78 | pad: 1 79 | kernel_size: 3 80 | } 81 | } 82 | layer { 83 | name: "relu2_1" 84 | type: "ReLU" 85 | bottom: "conv2_1" 86 | top: "conv2_1" 87 | } 88 | layer { 89 | name: "conv2_2" 90 | type: "Convolution" 91 | bottom: "conv2_1" 92 | top: "conv2_2" 93 | # param {lr_mult: 0 decay_mult: 0} 94 | # param {lr_mult: 0 decay_mult: 0} 95 | convolution_param { 96 | num_output: 128 97 | pad: 1 98 | kernel_size: 3 99 | stride: 2 100 | } 101 | } 102 | layer { 103 | name: "relu2_2" 104 | type: "ReLU" 105 | bottom: "conv2_2" 106 | top: "conv2_2" 107 | } 108 | layer { 109 | name: "conv2_2norm" 110 | type: "BatchNorm" 111 | bottom: "conv2_2" 112 | top: "conv2_2norm" 113 | batch_norm_param{ } 114 | param {lr_mult: 0 decay_mult: 0} 115 | param {lr_mult: 0 decay_mult: 0} 116 | param {lr_mult: 0 decay_mult: 0} 117 | } 118 | # ***************** 119 | # ***** conv3 ***** 120 | # ***************** 121 | layer { 122 | name: "conv3_1" 123 | type: "Convolution" 124 | # bottom: "conv2_2" 125 | bottom: "conv2_2norm" 126 | # bottom: "pool2" 127 | top: "conv3_1" 128 | # param {lr_mult: 0 decay_mult: 0} 129 | # param {lr_mult: 0 decay_mult: 0} 130 | convolution_param { 131 | num_output: 256 132 | pad: 1 133 | kernel_size: 3 134 | } 135 | } 136 | layer { 137 | name: "relu3_1" 138 | type: "ReLU" 139 | bottom: "conv3_1" 140 | top: "conv3_1" 141 | } 142 | layer { 143 | name: "conv3_2" 144 | type: "Convolution" 145 | bottom: "conv3_1" 146 | top: "conv3_2" 147 | # param {lr_mult: 0 decay_mult: 0} 148 | # param {lr_mult: 0 decay_mult: 0} 149 | convolution_param { 150 | num_output: 256 151 | pad: 1 152 | kernel_size: 3 153 | } 154 | } 155 | layer { 156 | name: "relu3_2" 157 | type: "ReLU" 158 | bottom: "conv3_2" 159 | top: "conv3_2" 160 | } 161 | layer { 162 | name: "conv3_3" 163 | type: "Convolution" 164 | bottom: "conv3_2" 165 | top: "conv3_3" 166 | # param {lr_mult: 0 decay_mult: 0} 167 | # param {lr_mult: 0 decay_mult: 0} 168 | convolution_param { 169 | num_output: 256 170 | pad: 1 171 | kernel_size: 3 172 | stride: 2 173 | } 174 | } 175 | layer { 176 | name: "relu3_3" 177 | type: "ReLU" 178 | bottom: "conv3_3" 179 | top: "conv3_3" 180 | } 181 | layer { 182 | name: "conv3_3norm" 183 | type: "BatchNorm" 184 | bottom: "conv3_3" 185 | top: "conv3_3norm" 186 | batch_norm_param{ } 187 | param {lr_mult: 0 decay_mult: 0} 188 | param {lr_mult: 0 decay_mult: 0} 189 | param {lr_mult: 0 decay_mult: 0} 190 | } 191 | # ***************** 192 | # ***** conv4 ***** 193 | # ***************** 194 | layer { 195 | name: "conv4_1" 196 | type: "Convolution" 197 | # bottom: "conv3_3" 198 | bottom: "conv3_3norm" 199 | # bottom: "pool3" 200 | top: "conv4_1" 201 | # param {lr_mult: 0 decay_mult: 0} 202 | # param {lr_mult: 0 decay_mult: 0} 203 | convolution_param { 204 | num_output: 512 205 | kernel_size: 3 206 | stride: 1 207 | pad: 1 208 | dilation: 1 209 | } 210 | } 211 | layer { 212 | name: "relu4_1" 213 | type: "ReLU" 214 | bottom: "conv4_1" 215 | top: "conv4_1" 216 | } 217 | layer { 218 | name: "conv4_2" 219 | type: "Convolution" 220 | bottom: "conv4_1" 221 | top: "conv4_2" 222 | # param {lr_mult: 0 decay_mult: 0} 223 | # param {lr_mult: 0 decay_mult: 0} 224 | convolution_param { 225 | num_output: 512 226 | kernel_size: 3 227 | stride: 1 228 | pad: 1 229 | dilation: 1 230 | } 231 | } 232 | layer { 233 | name: "relu4_2" 234 | type: "ReLU" 235 | bottom: "conv4_2" 236 | top: "conv4_2" 237 | } 238 | layer { 239 | name: "conv4_3" 240 | type: "Convolution" 241 | bottom: "conv4_2" 242 | top: "conv4_3" 243 | # param {lr_mult: 0 decay_mult: 0} 244 | # param {lr_mult: 0 decay_mult: 0} 245 | convolution_param { 246 | num_output: 512 247 | kernel_size: 3 248 | stride: 1 249 | pad: 1 250 | dilation: 1 251 | } 252 | } 253 | layer { 254 | name: "relu4_3" 255 | type: "ReLU" 256 | bottom: "conv4_3" 257 | top: "conv4_3" 258 | } 259 | layer { 260 | name: "conv4_3norm" 261 | type: "BatchNorm" 262 | bottom: "conv4_3" 263 | top: "conv4_3norm" 264 | batch_norm_param{ } 265 | param {lr_mult: 0 decay_mult: 0} 266 | param {lr_mult: 0 decay_mult: 0} 267 | param {lr_mult: 0 decay_mult: 0} 268 | } 269 | # ***************** 270 | # ***** conv5 ***** 271 | # ***************** 272 | layer { 273 | name: "conv5_1" 274 | type: "Convolution" 275 | # bottom: "conv4_3" 276 | bottom: "conv4_3norm" 277 | # bottom: "pool4" 278 | top: "conv5_1" 279 | # param {lr_mult: 0 decay_mult: 0} 280 | # param {lr_mult: 0 decay_mult: 0} 281 | convolution_param { 282 | num_output: 512 283 | kernel_size: 3 284 | stride: 1 285 | pad: 2 286 | dilation: 2 287 | } 288 | } 289 | layer { 290 | name: "relu5_1" 291 | type: "ReLU" 292 | bottom: "conv5_1" 293 | top: "conv5_1" 294 | } 295 | layer { 296 | name: "conv5_2" 297 | type: "Convolution" 298 | bottom: "conv5_1" 299 | top: "conv5_2" 300 | # param {lr_mult: 0 decay_mult: 0} 301 | # param {lr_mult: 0 decay_mult: 0} 302 | convolution_param { 303 | num_output: 512 304 | kernel_size: 3 305 | stride: 1 306 | pad: 2 307 | dilation: 2 308 | } 309 | } 310 | layer { 311 | name: "relu5_2" 312 | type: "ReLU" 313 | bottom: "conv5_2" 314 | top: "conv5_2" 315 | } 316 | layer { 317 | name: "conv5_3" 318 | type: "Convolution" 319 | bottom: "conv5_2" 320 | top: "conv5_3" 321 | # param {lr_mult: 0 decay_mult: 0} 322 | # param {lr_mult: 0 decay_mult: 0} 323 | convolution_param { 324 | num_output: 512 325 | kernel_size: 3 326 | stride: 1 327 | pad: 2 328 | dilation: 2 329 | } 330 | } 331 | layer { 332 | name: "relu5_3" 333 | type: "ReLU" 334 | bottom: "conv5_3" 335 | top: "conv5_3" 336 | } 337 | layer { 338 | name: "conv5_3norm" 339 | type: "BatchNorm" 340 | bottom: "conv5_3" 341 | top: "conv5_3norm" 342 | batch_norm_param{ } 343 | param {lr_mult: 0 decay_mult: 0} 344 | param {lr_mult: 0 decay_mult: 0} 345 | param {lr_mult: 0 decay_mult: 0} 346 | } 347 | # ***************** 348 | # ***** conv6 ***** 349 | # ***************** 350 | layer { 351 | name: "conv6_1" 352 | type: "Convolution" 353 | bottom: "conv5_3norm" 354 | top: "conv6_1" 355 | convolution_param { 356 | num_output: 512 357 | kernel_size: 3 358 | pad: 2 359 | dilation: 2 360 | } 361 | } 362 | layer { 363 | name: "relu6_1" 364 | type: "ReLU" 365 | bottom: "conv6_1" 366 | top: "conv6_1" 367 | } 368 | layer { 369 | name: "conv6_2" 370 | type: "Convolution" 371 | bottom: "conv6_1" 372 | top: "conv6_2" 373 | convolution_param { 374 | num_output: 512 375 | kernel_size: 3 376 | pad: 2 377 | dilation: 2 378 | } 379 | } 380 | layer { 381 | name: "relu6_2" 382 | type: "ReLU" 383 | bottom: "conv6_2" 384 | top: "conv6_2" 385 | } 386 | layer { 387 | name: "conv6_3" 388 | type: "Convolution" 389 | bottom: "conv6_2" 390 | top: "conv6_3" 391 | convolution_param { 392 | num_output: 512 393 | kernel_size: 3 394 | pad: 2 395 | dilation: 2 396 | } 397 | } 398 | layer { 399 | name: "relu6_3" 400 | type: "ReLU" 401 | bottom: "conv6_3" 402 | top: "conv6_3" 403 | } 404 | layer { 405 | name: "conv6_3norm" 406 | type: "BatchNorm" 407 | bottom: "conv6_3" 408 | top: "conv6_3norm" 409 | batch_norm_param{ } 410 | param {lr_mult: 0 decay_mult: 0} 411 | param {lr_mult: 0 decay_mult: 0} 412 | param {lr_mult: 0 decay_mult: 0} 413 | } 414 | # ***************** 415 | # ***** conv7 ***** 416 | # ***************** 417 | layer { 418 | name: "conv7_1" 419 | type: "Convolution" 420 | bottom: "conv6_3norm" 421 | top: "conv7_1" 422 | convolution_param { 423 | num_output: 512 424 | kernel_size: 3 425 | pad: 1 426 | dilation: 1 427 | } 428 | } 429 | layer { 430 | name: "relu7_1" 431 | type: "ReLU" 432 | bottom: "conv7_1" 433 | top: "conv7_1" 434 | } 435 | layer { 436 | name: "conv7_2" 437 | type: "Convolution" 438 | bottom: "conv7_1" 439 | top: "conv7_2" 440 | convolution_param { 441 | num_output: 512 442 | kernel_size: 3 443 | pad: 1 444 | dilation: 1 445 | } 446 | } 447 | layer { 448 | name: "relu7_2" 449 | type: "ReLU" 450 | bottom: "conv7_2" 451 | top: "conv7_2" 452 | } 453 | layer { 454 | name: "conv7_3" 455 | type: "Convolution" 456 | bottom: "conv7_2" 457 | top: "conv7_3" 458 | convolution_param { 459 | num_output: 512 460 | kernel_size: 3 461 | pad: 1 462 | dilation: 1 463 | } 464 | } 465 | layer { 466 | name: "relu7_3" 467 | type: "ReLU" 468 | bottom: "conv7_3" 469 | top: "conv7_3" 470 | } 471 | layer { 472 | name: "conv7_3norm" 473 | type: "BatchNorm" 474 | bottom: "conv7_3" 475 | top: "conv7_3norm" 476 | batch_norm_param{ } 477 | param {lr_mult: 0 decay_mult: 0} 478 | param {lr_mult: 0 decay_mult: 0} 479 | param {lr_mult: 0 decay_mult: 0} 480 | } 481 | # ***************** 482 | # ***** conv8 ***** 483 | # ***************** 484 | layer { 485 | name: "conv8_1" 486 | type: "Deconvolution" 487 | bottom: "conv7_3norm" 488 | top: "conv8_1" 489 | convolution_param { 490 | num_output: 256 491 | kernel_size: 4 492 | pad: 1 493 | dilation: 1 494 | stride: 2 495 | } 496 | } 497 | layer { 498 | name: "relu8_1" 499 | type: "ReLU" 500 | bottom: "conv8_1" 501 | top: "conv8_1" 502 | } 503 | layer { 504 | name: "conv8_2" 505 | type: "Convolution" 506 | bottom: "conv8_1" 507 | top: "conv8_2" 508 | convolution_param { 509 | num_output: 256 510 | kernel_size: 3 511 | pad: 1 512 | dilation: 1 513 | } 514 | } 515 | layer { 516 | name: "relu8_2" 517 | type: "ReLU" 518 | bottom: "conv8_2" 519 | top: "conv8_2" 520 | } 521 | layer { 522 | name: "conv8_3" 523 | type: "Convolution" 524 | bottom: "conv8_2" 525 | top: "conv8_3" 526 | convolution_param { 527 | num_output: 256 528 | kernel_size: 3 529 | pad: 1 530 | dilation: 1 531 | } 532 | } 533 | layer { 534 | name: "relu8_3" 535 | type: "ReLU" 536 | bottom: "conv8_3" 537 | top: "conv8_3" 538 | } 539 | # ******************* 540 | # ***** Softmax ***** 541 | # ******************* 542 | layer { 543 | name: "conv8_313" 544 | type: "Convolution" 545 | bottom: "conv8_3" 546 | top: "conv8_313" 547 | convolution_param { 548 | num_output: 313 549 | kernel_size: 1 550 | stride: 1 551 | dilation: 1 552 | } 553 | } 554 | layer { 555 | name: "conv8_313_rh" 556 | type: "Scale" 557 | bottom: "conv8_313" 558 | top: "conv8_313_rh" 559 | scale_param { 560 | bias_term: false 561 | filler { type: 'constant' value: 2.606 } 562 | } 563 | } 564 | layer { 565 | name: "class8_313_rh" 566 | type: "Softmax" 567 | bottom: "conv8_313_rh" 568 | top: "class8_313_rh" 569 | } 570 | # ******************** 571 | # ***** Decoding ***** 572 | # ******************** 573 | layer { 574 | name: "class8_ab" 575 | type: "Convolution" 576 | bottom: "class8_313_rh" 577 | top: "class8_ab" 578 | convolution_param { 579 | num_output: 2 580 | kernel_size: 1 581 | stride: 1 582 | dilation: 1 583 | } 584 | } 585 | layer { 586 | name: "Silence" 587 | type: "Silence" 588 | bottom: "class8_ab" 589 | } -------------------------------------------------------------------------------- /images/QR-kod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/QR-kod.png -------------------------------------------------------------------------------- /images/example1_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example1_color.png -------------------------------------------------------------------------------- /images/example1_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example1_gray.png -------------------------------------------------------------------------------- /images/example2_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example2_color.png -------------------------------------------------------------------------------- /images/example2_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example2_gray.png -------------------------------------------------------------------------------- /images/example3_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example3_color.png -------------------------------------------------------------------------------- /images/example3_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example3_gray.png -------------------------------------------------------------------------------- /images/example4_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example4_color.png -------------------------------------------------------------------------------- /images/example4_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/example4_gray.png -------------------------------------------------------------------------------- /images/high_noon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/high_noon.gif -------------------------------------------------------------------------------- /images/interface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/interface.png -------------------------------------------------------------------------------- /images/interface_and_photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/interface_and_photo.png -------------------------------------------------------------------------------- /images/interface_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/interface_color.png -------------------------------------------------------------------------------- /images/interface_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/interface_share.png -------------------------------------------------------------------------------- /images/opencv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/opencv.png -------------------------------------------------------------------------------- /images/opencv1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/opencv1.png -------------------------------------------------------------------------------- /images/opencv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/opencv2.png -------------------------------------------------------------------------------- /images/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alex13832/Colorizer-iOS/ef02f86953bcf868427eedfd262f1ba0ed2a0db1/images/options.png --------------------------------------------------------------------------------