頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


カメラで得た画像にVision frameworkを使う

Vision.frameworkをObjective-Cでやってみた
↑この続き。

どうなんだろうな?と思って確認すると、顔画像が90度回転してたり上下逆さまだと認識しないっぽい。

横向きだと検出しない

これで何が困るかというとiPhoneのカメラから得られる画像を回転を意識せずにUIImageViewで表示すると横向きになる(デバイスの姿勢はportrait)のでカメラから得たデータを回転させる必要がある。Vision frameworkの顔認識処理に渡すのはCGImageなのでここから回転させないと具合悪い。
いろいろと調べて試してみた結果、
Ios rotate, filter video stream in ios - Stack Overflow
↑ここにあるコードを使うと意図通り回転させることができた。


↑これでカメラで得た画像に対して顔検出処理ができるとこまでOK。


↑iPhone 7 Plusのフロントカメラでリアルタイムでやってみたが、、、
顔検出処理に200msecほど必要だと測定してたから追従性はこんなもんだろうとは思っていたが、、、問題は期待ほど精度が高くないこと。顔の向きや光の具合でとんでもない判定が出ることが多い。それから動画にはないけどいわゆる変顔みたいな表情も苦手の様子。
リアルタイムではなくてもいいので正確に表情を検出したかったんだけど、これじゃ使えない感じ。ただ、こういう機械学習モノはどんどん精度が上がっていくだろうし、瞳が取得できない不具合も修正はされていくだろうから時々チェックするようにせねば。
スポンサーサイト




<< 機械学習におけるデータの範囲(2)  TopPage  機械学習におけるデータの範囲 >>

コメント

突然の質問、失礼致します。

英語サイトなどほとんどswiftで、こちらのサイトへたどり着きました。

VNFaceObservationのlandmarksから例えば口の輪郭のouterLips(VNFaceLandmarkRegion2D)を取得した後、
swiftの例ですとこれをforで回し、
indexで取得できる配列になっているようなのですが、objective-cだと
以下のようなメソッド(normalizedPoints)で最初の値しか取れませんでした。。
===========================================
VNFaceLandmarkRegion2D *outerLips = [[face landmarks] outerLips];

for(int i = 0; i < outerLips.pointCount; i++){
const CGPoint p = *[outerLips normalizedPoints];
}
===========================================
この辺りの実装はどう対応されたのでしょうか
ご存知でしたらご教示頂けますと幸いです。

なお、わたしの場合VNFaceObservationをswiftから持ってきているため
挙動が変わってきているのかもしれません、、

宜しくお願い致します。

2018.01.16   rnc   編集

Re: 突然の質問、失礼致します。

こんにちは。

for (int ite=0;ite< outerLips.pointCount;ite++) {
CGPoint p = outerLips.normalizedPoints[ite];
]
で取ってますね。

2018.01.16   たつや   編集

やっぱりそうなりますよね、、
ありがとうございます!!
本当に助かりましたm(__)m

2018.01.16   rnc   編集


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1095-0d0e2e4e




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