|
43 | 43 |
|
44 | 44 | OpenCV 框架由 C++ 进行编码,通过将 C++ 代码插入 Objective-C 就成为了 Objective-C++ 代码。但是 Swift 本身与 Objective-C / Objective-C++ 并不兼容,所以需要一个Bridging Header 将 OpenCV 的功能接口暴露给 Swift。 |
45 | 45 | 以下为简单的示意图。 |
46 | | - |
| 46 | + |
47 | 47 |
|
48 | 48 | 添加一个 Objective-C 文件到项目中将其命名为“OpenCvWrapper”,包含`OpenCvWrapper.h`与`OpenCvWrapper.m`两个文件,需要将文件扩展名“.m”改为“.mm”。如果自动弹出提示是否添加 Bridging-Header 文件选择添加;如果没有提示,则手动添加一个 Bridging-Header 文件,即添加一个头文件(Header file),重命名为“项目名-Bridging-Header.h”(本例中为:Haze-Free-Bridging-Header.h),部分项目结构图如下。 |
49 | | - |
| 49 | + |
50 | 50 |
|
51 | 51 | ## 业务逻辑 |
52 | 52 |
|
@@ -142,45 +142,45 @@ using namespace cv; |
142 | 142 | ## 错误 |
143 | 143 |
|
144 | 144 | 在写 App 的过程中遇到了一个重大问题,去雾算法验证无误后始终无法得到正确的去雾图像,于是开始对去雾步骤中所有的阶段性图像打断点,一一验证得到的图像结果。最后根据StackOverFlow 上的解释以及断点结果查明了原因,原因出在 `UIImageToMat` 方法返回的Mat 类型上。 |
145 | | - |
| 145 | + |
146 | 146 | `UIImageToMat` 方法返回的Mat类型为 `CV_8UC4`,而程序中需要的 Mat 格式为 `CV_8UC3`,需要使用`cvtColor()` 方法对其进行转换,改正后程序正常运行。 |
147 | 147 | 在使用 SFSymbols 时遇到了一些bug,UIButton的 image 使用 SFSymbol出现了无法显示Background 的问题,Debug View Hierarchy也看不出来名堂,最后只好换了自定义的icon。 |
148 | | - |
| 148 | + |
149 | 149 |
|
150 | 150 | ## App 总结 |
151 | 151 |
|
152 | 152 | ### UI总结 |
153 | 153 |
|
154 | 154 | 研究了iOS的设计原则后,针对该程序设计了以下页面,包含欢迎页面、权限获取页面、图像浏览页面、图像处理页面与图像分享页面,尽最大程度减少不同页面之间的耦合,使整体的页面逻辑更加清晰。 |
155 | | - |
| 155 | + |
156 | 156 | 在对iOS开发框架进行实践后,为 App 增加了中值滤波和灰度转换的功能,同时嵌入了Unsplash 获取图像的SDK,使得程序不仅能够从相册、相机获取图像,还能够直接从 Unsplash 无版权图像网站通过关键字检索获取图像。同时新增了图像分享的入口。为了适应新的变化将页面进行了部分重组,使其更加符合开发需求。 |
157 | | - |
| 157 | + |
158 | 158 | 未来可能会考虑将该项目进行开源,现阶段仍然希望其具备更多的功能,以下为软件的运行测试。 |
159 | 159 |
|
160 | 160 | ### 页面逻辑 |
161 | 161 |
|
162 | | - |
| 162 | + |
163 | 163 |
|
164 | 164 | - 开启App后进入引导页面,提示用户使用该App需遵守相关用户协议。 |
165 | 165 | - 点击开始处理后跳转至第二个页面,页面显示提示需要选择图像 |
166 | 166 | - 点击选择图像后,用户需要在三种图像获取图形中做出选择,或选择取消 |
167 | 167 |
|
168 | 168 | ### 运行测试 |
169 | 169 |
|
170 | | - |
| 170 | + |
171 | 171 |
|
172 | 172 | - 处理相册图片实例,点选最近拍摄的照片,程序在本视图中加载此图像 |
173 | 173 | - 点击三个处理按钮中的最右者,即中值滤波效果,视图会进行跳转 |
174 | 174 | - 新的视图包含了保存和分享图像的功能,若点击保存,程序会将图像写入相册并告知用户 |
175 | 175 |
|
176 | | - |
| 176 | + |
177 | 177 |
|
178 | 178 | - 尝试从相册加载一张新图像,可以看到图像中的树林被雾霾覆盖 |
179 | 179 | - 点击最左侧的去雾操作,由于去雾操作运算量较大,并且为了避免用户在运算过程中点按按钮,整个可操作区域不可点按,同时有活动指示环展示加载进度 |
180 | 180 | - 需要注意的是三个图像操作都采用了多线程的方式 |
181 | 181 | - 处理完成图像后可以点击分享按钮使用系统内建的分享服务进行图像的分享 |
182 | 182 |
|
183 | | - |
| 183 | + |
184 | 184 |
|
185 | 185 | - 尝试从相机拍摄一张图像 |
186 | 186 | - 点击拍摄按钮后图像被获取,可以使用该图像进行处理 |
|
0 commit comments