AVSemanticSegmentationMatteの機能をOSSに追加

まだまだ情報は少ないようですが、今年の11月から調査を開始して2週間以内に機能を自作ライブラリーに組み込みました。

参考資料

https://developer.apple.com/videos/play/wwdc2019/225/

OSS内に組み込んだ機能

これは調査の段階で確認した機能

どのように実現しているのか?

自作ライブラリー

           MaskingLayer         

機能を単体で作成したサンプル

MaskMatte

機能クラス

https://github.com/daisukenagata/MaskMatte/blob/master/MaskMatte/MaskFilterBuiltinsMatte.swift

ポイントのメソッド

//MARK: AVCapturePhotoCaptureDelegate
extension MaskFilterBuiltinsMatte: AVCapturePhotoCaptureDelegate{
    
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        var uiImage: UIImage?
        if let imageData = photo.fileDataRepresentation() {

            uiImage = UIImage(data: imageData)

            for semanticSegmentationTypes in output.enabledSemanticSegmentationMatteTypes {
                if semanticSegmentationTypes == .hair {
                    semanticSegmentationType = semanticSegmentationTypes
                    maskFilterBuiltins(callBack(image:), photo: photo, ssmType: semanticSegmentationType!, image: uiImage ?? UIImage())
                }
            }
        }
    }
    func callBack(image: UIImage?) { call(image) }
}

上記のメソッドを呼び出しているコード

photoOutput?.capturePhoto(with: settings, delegate: self)

settingsはAVCapturePhotoSettingsという、カメラの詳細を決めるプロパティです。

メソッド内で様々に設定しています。https://developer.apple.com/documentation/avfoundation/avcapturephotosettings AVCapturePhotoSettingsリファレンス内に、実装しているコードの詳細説明が記載されています。

髪を合成しているメソッド

private func maskFilterBuiltinsChanges~~~

private func matteSetting~~~

CoreImageの複合トリックでMake

CIFilter.gammaAdjustとCIFilter.colorMatrixでググってみて下さい。

gammaとは非線形濃度変換。コントラストの調整です。

colorMatrixはRGBの部分の値を調整します。

value2,3,4でスライダーから取得した値を設定して髪の加工を可変しています。

2つのCoreImage機能を合わせることで、画像のような本物のような髪の色を実現しました。

メモリー使用量のコントロール

260MBから60MBほどにコントロール出来ます。 なのでインターナルに宣言する場合はoptinalにするとnilに出来、コントロール出来ます。

func cameraReset()

以上、貴重なお時間お読み下さいまして、誠にありがとうございます。