概述

所谓智能裁剪其实就是按照指定尺寸裁剪或显示出包含图片核心特征的区域,目前很多智能裁剪都是在服务器端做的,在客户端需要访问时直接裁剪放到Redis或者提前裁剪好以备访问。但是找了一圈直接在iOS客户端进行裁剪的库还不多,或者使用成本比较高,不能即拿即用。但是有时候客户端可能并非直接从服务器端获取数据而是读取相册数据,不可能先把图片存放到服务器端裁剪然后再拿来用,考虑到这种场景也不再少数,因此就有必要思考一套客户端智能裁剪的方案。

免费好用的智能裁剪库

最近两天整理了之前开发一个软件过程中自己开发的一个客户端智能裁剪库供有需要的同学使用,当然后面有时间的话会整理开源。说是库本质就是一套算法而已,但是在编写这套算法期间也参考评估过很多已有或者想要使用而没有使用的解决方案。

首先说一下目前在网上比较容易找到的一些库存在的问题:

  • 没有iOS对应的版本,集成起来极其复杂,之前为了用一个不错的库甚至在iOS调用Python库
  • 速度慢,生成一张智能裁剪后的图片需要1s左右,不再可容忍范围之内
  • 人像识别不准确,图片中占比较小的人脸识别不出来,甚至有可能出现误识别(这个其实比识别不出来问题还大)
  • 基于专利收费算法实现(例如使用SRUF),不仅开发者使用起来要引用大量的库而且有收费风险
  • 集成比较麻烦,使用起来光配置环境就要摆弄半天,还不一定能成功

当然,事实上在探索过程中也走了不少的弯路,遇到的问题要比上面多得多,包括有些算法只能裁剪横图,对于宽高比较小的竖图支持很差,又或者引入大量的库造成app本身大小直线上升等等。。。因此这也就是为什么自己要开发一个新的库SmartCrop.framework而不是基于现有库来做的原因。

那么SmartCrop.framework智能裁剪库又有什么特点呢:

  • 跨平台,当然既然作为一个iOS开发者一定要包含iOS版本(尽管此文中只提供了iOS版本,不过其实这个库本身基于c++实现,天然具有跨平台特性,后续有时间也会整理其他平台的版本)
  • 速度快,几乎可以做到实时裁剪?(当然这个比较理想,不过测试中本文提供的库对于裁剪1000px以上的大图iPhone X上已经可以做到0.1s以下,后续会持续优化)
  • 精准的人脸识别,基于神经网络进行识别,让人像识别更加精准迅速(尽管需要一个训练好的模型,不过模型本身并不大)
  • 免费、好用,没有专利之争、集成迅速,按照步骤一分钟之内完成

当然,SmartCrop.framework也并非完美,这个库本身基于OpenCV的c++算法实现,综合了很多算法实现了特征点检测,这也就是说App需要集成opencv2.framework。另外算法本身还有优化空间,特别是特征点检测中对于色差分辨不是特变明显的图片裁剪精准度会有下降,后面也会进一步优化,不过对比了几个线上已有的库来说精准度应该要比这些库提高不少,毕竟再好的智能裁剪也是基于某些特征,和人为的意识还有不少差别。

和其他库的对比

这里选取了之前使用过的一个Python库作为对比,在iOS中运行10张1000px左右的图片裁剪需要15s左右,这也是之前app中使用的实际结果。当然这其中有间接调用Python的成本,以至于后来直接测试了它的Android版本,大概耗时10s。下面是10张图的裁剪结果对比,为了方便看出裁剪效果使用了横图裁剪成竖图的对比,而图片选择部分尽量包括了人像和非人像图片,视频中每组图有三张,分别是原图、第三方库裁剪后的效果、SmartCrop.framework裁剪后的效果:

当然从视频不难看出,SmartCrop.framework人像裁剪相当精准,第1、3、4中的人脸第三方库没有识别出来,在非人脸识别的图片中第6张树的裁剪不理想。当然SmartCrop.framework也不是百分百完美,最后一张猫的图片裁剪效果不如第三方库,因为除了猫之外将右侧的树识别成了关键特征位置。当然也会发现第2张图片中两个库都识别出了多个人脸,也都在有限的宽度内裁剪除了两个人,但是位置不同,这个和裁剪策略和特征分析算法有关。

简单的使用方法

引入SmartCrop.framework只需要从这里下载SmartCropDemo,找到其中的SmartCrop.framework直接将此库拖拽到自己的项目中,在Xcode的Embedded Binaries中添加SmartCrop.framework即可(或者Build Phase的Copy File中添加SmartCrop.framework),然后在Linked Frameworks and Libraries中添加libc++.tbd,最后将opencv2.framework拖拽到项目中即可(注意由于github文件大小限制,这个库没有直接在code中提供,可以到这里直接下载解压使用)。

SmartCrop.framework在开发的过程中尽量的简化,通篇只有一个类SmartCropper,此类也只有两个方法并且以ObjC静态方法出现:

+(UIImage *)cropImage:(UIImage *)image size:(CGSize)size;
+(CGRect)cropRectWithImage:(UIImage *)image size:(CGSize)size;

而通常情况下直接调用最上面的一个方法即可满足裁剪需求,那么为什么还要提供第二个API呢?原因是有些情况下并不想裁剪图片而只想找到图片的核心区域,SmartCrop.framework也已经做好了。

当然Swift中使用也仅仅需要一个bridge header而已,然后调用**SmartCropper.cropImage(image, size:size)**即完成了所有裁剪操作。

SmartCrop裁剪效果:

原图

SmartCrop裁剪后

原图

SmartCrop裁剪后

原图

SmartCrop裁剪后

性能究竟怎么样

Demo界面:

为了验证性能做了一个上面提到的demo,在主界面选择Photo Library可以实时预览相册中的图片智能裁剪后的效果,按住主界面可以对比原图;点击Browser是对于前面提到的10张测试图的实时预览,可以从下面的展示效果看到几乎是实时生成的,没有太多卡顿,上面说的1000px以上的图片,低于0.1s可以完成裁剪应该不会太夸张,当然实际使用中不会每张图都实时显示实时生成,可以提前存储,加上预加载可以做到0卡顿效果。

运行效果如下:

还要说一下,SmartCrop.framework本身基于OpenCV 3.4.4进行开发,理论上可以向下兼容几个版本,但是太旧的api可能无法使用,为了获得更稳定的效果建议直接使用3.4.4版本。另外文中所有演示图片来源于互联网,仅作为演示学习之用,如存在版权问题请联系本人(kenshincui@hotmail.com),即刻下线。

iOS客户端图片智能裁剪相关推荐

  1. veImageX 演进之路:iOS 高性能图片加载 SDK

    动手点关注 干货不迷路 1.  SDK简介 图片在业务应用场景是一个常见的元素,veImageX(简称ImageX)为业务提供了灵活.高效的一站式图片处理解决方案,包括了服务端 SDK.上传 SDK ...

  2. ios 图片居中裁剪_IOS图片裁剪和小图看大图动画

    IOS的UIImagePickerController可以让用户通过相机或者相册获取想要的图片,并且通过设置allowsEditing属性允许用户在选择了图片以后对图片进行裁剪.不过在某些时候会出现正 ...

  3. iOS从相册选择图片并裁剪,可用于上传头像

    iOS从相册选择图片并裁剪 前言 笔者最近接了一个任务,是从手机相册选择图片并裁剪后上传.于是在裁剪的这一块,我用了VPImageCropper.从相册获取图片,我一开始看的是TZImagePicke ...

  4. iOS 客户端基于 WebP 图片格式的流量优化(下)

    在iOS 客户端基于 WebP 图片格式的流量优化(上)这篇文章中,已经介绍了WebP格式图片的下载使用,仅仅只有这样还远远不够,还需要对已经下载的图片数据进行缓存. 曾经有句名言『计算机世界有两大难 ...

  5. php智能裁剪,php Codeigniter实现智能裁剪图片的方法

    CodeIgniter是一套给PHP网站开发者使用的应用程序开发框架和工具包. CodeIgniter 是一个简单快速的PHP MVC框架.EllisLab 的工作人员发布了 CodeIgniter. ...

  6. ios 图片居中裁剪_iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)...

    iOS UIImageView 根据需求调整frame 1.图片的宽和高不相等,截取图片的中间部分,截取的部分Size明确 2.图片的宽度要等于其父视图的类的宽度,然后根据宽度计算高度,保证 图片不变 ...

  7. 搭建自己的图片处理服务 — 智能裁剪、旋转、占位一站搞定

    前言 前两天刚搭建了自己的博客,并写了一篇介绍性的文章:<极简博客搭建,搭建超级简单又好看>,这几天准备写点文章体验一下这款博客.发现不论是撰写文章还是展示效果,都非常符合我的品味,真是太 ...

  8. iOS实现动态区域裁剪图片

    阅读 249 收藏 32 2017-11-29 原文链接:github.com 想自己动手搭建一个 Discuz 论坛?试试腾讯云上实验室吧https://cloud.tencent.com/deve ...

  9. php ci 处理图片 裁剪,Codeigniter实现智能裁剪图片的方法

    一副1024*768大小的图片,裁剪到240*240大小,裁剪后不失真,尽可能保留图片主题含义. 我使用到的方法: 1. 先将图片等比例缩略到可以裁剪的大小: 如果是宽幅图片,则按高度等比例缩放到高度 ...

最新文章

  1. 论文笔记 DNorm: disease name normalization with pairwise learning to rank
  2. “ GPU视频处理技术调研报告 ”
  3. linux 修改docker配置文件,dockerfile动态修改服务配置文件(示例代码)
  4. Qt工作笔记-进入文件夹或打开网站(QDesktopServices::openUrl的使用)
  5. 如何修改帝国cms文章点击量默认值和成倍增加
  6. 微信支付分使用用户数超2.4亿 每日使用笔数达千万级
  7. Kafka API: TopicMetadata
  8. Python学习笔记: 闭包
  9. MyBatis(五)------MyBatis配置
  10. java servlet的包下载_javax.servlet.jar下载
  11. linux设计论文题目,计算机linux本科毕业论文题目
  12. 基于opencv 的OCR小票识别(1)
  13. 如何用计算机声卡录声音,录音声卡怎么设置 录音声卡设置教程
  14. 阿里P9:程序员的“青春饭”,从什么时候开始结束?
  15. 利用mail 发送163 邮件
  16. 函数在c99中隐式声明无效_C函数的隐式声明
  17. 读卡器插电脑不显示盘符
  18. 直通车roi提升优化方法 如何判断直通车权重高低
  19. 2023年华为认证HCIA云计算题库(H13-511)
  20. HM2022ssm-mp4.2【DML增删改编程控制(2)】

热门文章

  1. manifold 流形
  2. 网秦手机杀毒软件 v2.1 symbian s60 _symbian 7.0+ 免费
  3. 想起小时候去乡下二姨家玩
  4. [经济杂谈]经济危机的真相
  5. 灵隐寺招聘员工:没有KPI,佛系上班,四点半下班……
  6. for循环canvas渲染图片
  7. 教你用身份证号查社保卡号 个人电脑号
  8. mysql 如何看索引命中_mysql索引命中规则讲解
  9. C#发送企业内部邮件
  10. 怎么用科学计算机算反三角函数值域,反三角函数值域怎么求