iOS AI相机App开发教程,02 实现瘦脸功能

瘦脸功能实现原理瘦脸

瘦脸功能实现原理

iOS AI相机App开发教程,02 实现瘦脸功能

瘦脸

人脸检测

首先需要对照片进行人脸检测,检测出人脸轮廓位置。人脸检测的方法非常多。在“魔法相机”中使用了 iOS Vision 库中的 VNDetectFaceLandmarksRequest 方法来进行人脸检测。使用这个方法可以充分利用iPhone的AI能力,并且检测效果也非常好。

MLS图像变形算法

MLS变形算法又叫做移动最小二乘变形算法,该算法引用量较高,效果相对较好,在变形过程中几乎毫无违和感,这也是MLS的优势所在。

MLS变形算法在美颜中的人脸变形特效或者图像变形特效中有着较多的应用,比如“天天P图”中的疯狂换脸特效,就是以MLS变形为基础开发设计的。”魔法相机“的瘦脸功能和变老功能也使用了MLS算法。

实现原理

使用人脸检测获得人脸眼睛到下巴的轮廓点,并在图片边缘进行锚点,然后通过MLS变形,将人像下半部分的脸和下巴的锚点做适当的收缩。

代码讲解

// 瘦脸特效方法func DoFaceThin(uiImage: UIImage, completionHandler: @escaping CompletionHandle) {        let image = CIImage(image: uiImage)        let weakSelf = self        let width = uiImage.size.width        let height = uiImage.size.height                // 人脸检测完成回调方法        let faceRequest = VNDetectFaceLandmarksRequest() { request, error in            guard let results = request.results as? [VNFaceObservation] else {             ...            }            let face = results.first             ...            guard let boundingRect = face?.boundingBox else {               ...            }           // 获得人脸位置盒子            var boundingBox = CGRect(x:CGFloat(boundingRect.origin.x * width),                                     y:CGFloat(height - ((boundingRect.origin.y + boundingRect.size.height) * height)),                                     width: CGFloat(boundingRect.size.width * width),                                     height: CGFloat(boundingRect.size.height * height))            // 锚点坐标            var points: [CGPoint] = []            // 变换后坐标            var toPoints: [CGPoint] = []            // 将人脸轮廓点添加到锚点数组中            for point in face!.landmarks!.faceContour!.normalizedPoints {               let p = CGPoint(x: CGFloat(point.x * boundingBox.width + boundingBox.origin.x),                               y: CGFloat((1.0 - point.y) * boundingBox.height + boundingBox.origin.y))                points.append(p)                toPoints.append(p)            }                        // 将图片边缘添加到锚点数组里            for i in stride(from: 0, to: Int(height) ,by: 80) {                let p1 = CGPoint(x: 0, y:CGFloat(i))                let p2 = CGPoint(x: width, y:CGFloat(i))                points.append(p1)                toPoints.append(p1)                points.append(p2)                toPoints.append(p2)            }            // 将图片四角添加到锚点列表中            let bottomLeft = CGPoint(x: 0, y: height)            let bottomRight = CGPoint(x: width, y: height)            points.append(bottomLeft)            toPoints.append(bottomLeft)            points.append(bottomRight)            toPoints.append(bottomRight)                        // 对人脸轮廓进行收缩,实现瘦脸效果            for index in 1...6 {                let idx1 = 8 - index                let idx2 = 8 + index                                let w = points[idx1].x - points[idx2].x                                let padding = w/CGFloat(8+index*2)/2                                toPoints[idx1].x -= padding                toPoints[idx2].x += padding            }                        // MLS 变换实例,传入锚点和目标点坐标,对图片进行变换            let thinFaceOperation = ThinFaceOperation()            thinFaceOperation.setupData(image: uiImage, landmarks: points, toPoints: toPoints)                        let imageInput = PictureInput(image: uiImage)                        let imageOutput = PictureOutput()            imageOutput.imageAvailableCallback = { image in                completionHandler(image)                weakSelf.lockFx.unlock()            }                        imageInput --> thinFaceOperation --> imageOutput            imageInput.processImage(synchronously:true)        }                // 执行人脸检测        let handler = VNImageRequestHandler(ciImage: image!,options: [:])        DispatchQueue.global(qos: .userInitiated).async {            try? handler.perform([faceRequest])        }    }

MSL变换需要两组数据,分别是锚点(原始点)的坐标位置数组和目标点(变换后的点)的坐标位置数组。
实现 VNDetectFaceLandmarksRequest 回调方法,在回调中处理人脸数据。
将图片的边缘和4角坐标也都传入锚点和目标点数组,这样可以防止图片边缘因为MSL变换产生畸变。
将人类数据传入锚点和目标点数组,并处理目标点坐标,使脸部收缩变瘦。
最后调用MSL方法实例,完成变换操作。

瘦脸特效完整代码 MagicCamera/Vision/ThinFace.swift

MSL算法的具体实现可以看源码文件: MagicCamera/Vision/MlsOperation/MovingLeastSquareHelper.mm

魔法相机项目

系列教程: 魔法相机 - 文集 - 简书

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/70047.html

(0)

相关推荐

  • 养生没有固定的方法,吸取的是经验和教训

    当下,每个人都想学点养生方面的知识,目的是让自己和家人多一份健康保障。但切记千万不要盲从,要根据自己和家人的身体状况有条件的选择。比如:你和家人普遍血压高,血脂高,体型肥胖,就要少吃些脂肪含量高的食物,这一点我们都知道。但无论吃什么都要少吃,让自己保持饥饿感最好。高是多了,胖也是多了,既然病根是“多了”,那我们少吃点,让身体把多出的部分消耗掉就可以了。肝脏不好,就要少吃酸性的东西,多吃些青色食物来通达肝气。也可以吃些枸杞。枸杞泡水喝很多人都知道,但我不认同这种方法,最好是嚼服,慢慢咀嚼,等口腔里产生很多唾液时再同枸杞一起咽下去。

    生活 2021年8月30日
  • 华为 芯片 台积电,华为的5nm芯片

    视频加载中...

    科技 2021年12月9日
  • 左边是天才,右边是疯子,埃隆马斯克的童年

    埃隆·马斯克,这位一心要殖民火星的怪咖兼超级富豪1971年6月28日出生,现年52岁,出生于南非。没看错,马斯克不是地道的美国人,但他可以说是美国精神在现代的完美代表:“崇尚独立,开拓进取”。

    科技 2021年12月23日
  • 高血压吃什么水果好呢?

    高血压适合吃的水果有:西瓜、山楂、苹果、山楂、猕猴桃、橘子、菠萝、香蕉等等一些含钾的水果,钾有一定的利尿作用,有助于控制高血压。其中,吃香蕉还有助于肠胃蠕动,有助于消化,多吃山楂有...

    生活 2021年9月9日
  • 身体怕风怕冷人怎么回事

    身体如果出现怕风怕冷的原因主要有以下两个:

    生活 2021年9月10日
  • 妻子一夜破产负债500亿(千万富豪破产沦落街头)

    人生无常,没有人能够一直处于巅峰处于制高点,起起落落才是人生的轨迹。

    生活 2021年12月17日