LoginSignup
1
3

美顔小顔加工アプリを作る

小顔.gif

インスタにアップロードする時って小顔にしますよね?
小顔フィルターの実装の仕方です。

顔を検出してゆがませる

顔の領域を中心にゆがませます。
これで、周囲はなるべく自然に、顔だけ徐々に小さくできます。

顔の検出

let request = VNDetectFaceRectanglesRequest()
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try? handler.perform([request])
guard let results = request.results, let firstFace = results.first else { return nil }
let box = firstFace.boundingBox
let boxInImage = VNImageRectForNormalizedRect(CGRect(x: box.minX, y: box.minY, width: box.width, height: box.height), cgImage.width, cgImage.height)

これが画像内の顔の領域です。
この領域に、
CIBumpDistortion
というフィルターを適用します。

let boxCenter = CGPoint(x: boxInImage!.minX+boxInImage!.width/2, y: boxInImage!.minY+boxInImage!.height/2)
        
let radius = boxInImage!.height * 1.7
        let filter = CIFilter(name: "CIBumpDistortion", parameters: [kCIInputImageKey:ciImage,
                                                                    kCIInputCenterKey:CIVector(cgPoint: boxCenter),
                                                                    kCIInputRadiusKey:NSNumber(floatLiteral: radius),
                                                                     kCIInputScaleKey:NSNumber(floatLiteral: -Double(scale))
                                                                    ])?.outputImage!
let cropped = filter?.cropped(to: ciImage.extent)

これで顔部分だけ歪んで収縮した画像が得られます。
radiusが画像の端を越えると、画像領域全体が小さくなってしまうので、最後にクロップしています。

🐣


フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習/AR関連の情報を発信しています。

Twitter
Medium
GitHub

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3