頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Vision.frameworkをObjective-Cでやってみた

最近ネット上でサンプルコードを見つけても大抵はSwiftで書かれてあるのでそれをObjective-Cにするにはどうするんだ?ってなることが多くええ加減Swiftやるか?って悪魔のささやきが聞こえたりもするけど、まだだ、まだその時では無い、、、、

そんなわけでObjective-CでVision.frameworkを使って顔の検出をしてみた。
[iOS 11] 画像解析フレームワークVisionで顔認識を試した結果 | Developers.IO
↑参考にしたのはこちら。ありがたいです。

こちらを参考にしつつFace Landmarksってのをやろうとしたんよ。顔の目や口の形状が取れるような絵があるので面白そう!ってことで。

上記リンクのコードを参考にしつつ引っかかったところをメモしておくと、、、
{
    struct CGImage *image = originalImage.CGImage;//—(1)

    VNDetectFaceLandmarksRequest *request = [VNDetectFaceLandmarksRequest new];
    NSDictionary *dictionary = [[NSDictionary alloc] init];

     VNImageRequestHandler *handler = [[VNImageRequestHandler alloc] initWithCGImage:image options:dictionary];

    [handler performRequests:@[request] error:nil];

    for(VNFaceObservation *observation in request.results) { //—(2)
        if (observation){
            NSLog(@"%@",observation);//—(3)
        }
    }
}
originalImageはUIImageオブジェクト。CGImageは(1)で取れる。
(2)の部分は取得した顔の数だけループ。一人なら一回。
(3)でやりたい処理を記述すればOK。
参考記事にもあるけどUIViewなどとは原点位置が違うので要注意。
後、Landmarksに関して
{
    VNFaceLandmarks2D *landmarks = observation.landmarks;
    VNFaceLandmarkRegion2D *outerLips = landmarks.outerLips;
}
↑こんな感じで二次元の正規化された座標を得ることができるんだけど、この場合は元画像ではなくobservation.boundingBoxに対しての位置なので注意。

landmarks結果

↑outerLipsだけやってみた結果。
得た座標を繋いでいくと閉じないので最初と最後のデータを繋いで閉じるようにしてる。リファレンスには何も記述はないけどまあそういうことなんだろう。

iPhone 7 Plus実機で実行したら検出部分でおよそ200msecほどかかってる。画像サイズを小さくしても180msec弱くらいでさほど変わらない感じ。
1秒間に5フレーム程度か、、、(-_- ;

となると先日のiPhone X発表時にあったデモみたいなスムーズな顔面のトラッキング&表示はしんどそう。

keynoteのiPhoneXデモ

↑これね、誰だかわかんないけどフェデリギさん。
iPhone Xは新しいセンサーとかあるからできるんだろうとは思うけど、そう考えるとすでに同じようなことができてるMSQRDアプリはすごいよな。どういうアルゴリズムなんだろ?



<< 機械学習におけるデータの範囲  TopPage  iPhone X対応でSafeArea相当のviewを置いてみる >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1093-2fc0f61b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad