OpenCVによるモザイク処理アプリ [OpenCV関係]
昨夜、遅くまでOpenCVで遊んでいた。そもそも何を思ったかというと、たまたまこの記事を見た。写真にモザイクをかけるアプリ。これはiPhoneアプリで、モザイクをかけたい位置を指定するようになっている。こんなのOpenCVの顔認識を使えば自動的にできるじゃん、iPhoneにもOpenCVは移植されているし、と思った。
で、ちょっとやってみようと思ったのが運のつき。ついつい嵌って夜中まで遊んでしまった。で、以前遊んだFaceTrackerに手を入れて動作するものを作った。その結果は....
昔の家族旅行の写真にモザイクをかけてみた(追記)。
ちゃんとひとの顔を見つけ出してその目の部分にモザイクがかかっている。微笑ましい家族旅行の写真が、一気に怪しげな見てはいけないものになったような感じになる。
OpenCVを使えば画像の中にある顔の位置を取り出すことができる。その中から目の部分にモザイク処理をかければいい。モザイク処理(Pixelization)はOpenCVには実装されていないが、いくつかのフィルタを組み合わせれば出来ななくはない。しかし処理そのものはそれほど難しくはないので自分で実装しても手間ではない。昨夜さくっと実装した。
モザイク処理とは決まった大きさのタイルの中をすべて同じ値の代表値で埋めてしまう処理。代表値にはありがちなものとして
タイルの中を同じ値で塗りつぶしてしまう処理なので情報は欠落する。でもその欠落具合は代表値の選び方で印象が違う。平均値は見た感じ一番なめらかで、最大値最小値は欠落が大きい感じがする。その他はその間という感じ。ちなみにタイルの真ん中の値を代表値にするのが普段見る「モザイク処理」の感じに一番近い。
もちろんOpenCVなのでムービーにもそのまま使える。ためしにYouTubeで人気の動画にかけてみた。
so-netのデフォルトのページレイアウトでははみ出てしまうので、見やすくするためにYouTubeにジャンプする。OpenCVは音に対して無頓着なので何もしないと音声トラックはカラになる。
僕は普段テレビをほとんど見ないのでなぜこのCMの動画がYouTubeでもてはやされてるのかよく知らないけど、OpenCVの顔認識は顔のピクセル数が小さいと見つけられないので正面向きのバストショットが連続するこういった動画がちょうどいい。ときどき認識に失敗してるけどひとつにはOpenCVにデフォルトでそなわっているカスケードの学習データは傾いた顔に弱いせい。細かいパターンのあるシーンで擬陽性も現れてる。圧縮率が高くてノイズに影響を受けたせいもある。
でもカスケードにはまったく手を加えていないのに認識精度は高い。リアルタイム処理は僕のiMacでは難しくてせいぜい2〜3fpsぐらい。このムービーはオフラインで変換に2分ぐらいかかった。
いいかげん夜中まで遊んでから、他のだれも気がついてないわけないな、と思ってググったらやっぱりやってる人がいっぱいいた。なあんだ。せっかく作ったのに。
ほんとは、画像に尻がみつかるとそこに「しり」と書き込む「田村信処理」というのをやりたかった。これはつる美さんからもらったお題。しかし、尻はあらためて学習する必要があるのにWebにある尻の画像は顔の画像に較べて3〜4桁枚数が少ない。しかも尻は画像としてあまり構造がなく、学習数に対してHarrカスケードのツリーの発達が非常に遅い。尻認識の難しさは顔認識のそれと何桁も違うということになる。残念ながらあきらめた。
なんだまた今日も遅くなってしまったじゃないか。さっさと寝よ。
追記:
女房から家族写真はモザイクがかかっているとはいえ、個人が特定できそうなのでよろしくない、という指摘があった。
たしかにそうかもしれないので、Googleで「家族旅行」で検索して上位に上がったよそ様の写真に差し替えておくことにした。もちろん結果は同じ。
で、ちょっとやってみようと思ったのが運のつき。ついつい嵌って夜中まで遊んでしまった。で、以前遊んだFaceTrackerに手を入れて動作するものを作った。その結果は....
昔の家族旅行の写真にモザイクをかけてみた(追記)。
ちゃんとひとの顔を見つけ出してその目の部分にモザイクがかかっている。微笑ましい家族旅行の写真が、一気に怪しげな見てはいけないものになったような感じになる。
OpenCVを使えば画像の中にある顔の位置を取り出すことができる。その中から目の部分にモザイク処理をかければいい。モザイク処理(Pixelization)はOpenCVには実装されていないが、いくつかのフィルタを組み合わせれば出来ななくはない。しかし処理そのものはそれほど難しくはないので自分で実装しても手間ではない。昨夜さくっと実装した。
モザイク処理とは決まった大きさのタイルの中をすべて同じ値の代表値で埋めてしまう処理。代表値にはありがちなものとして
enum { FtMosaicNoEffect = -1, FtMosaicGeometricCenter, FtMosaicMean, FtMosaicMedian, FtMosaicMinimum, FtMosaicMaximum, };などを考えた。GeometricCenterはタイルのちょうど真ん中の値を代表値にするもの。同様に平均値、中央値、最小値、最大値を代表値にする。OpenCVの画像データ構造であるIplImage構造体のROIの中をモザイクにする関数
void ftMosaic(IplImage *image, CvSize *tileSize, int method, bool roiStrict);というのを書いた。ROIが定義されていないとOpenCVの他の関数と同じように全画面を対象にする。ひとつ目の引数は書き換える画像、ふたつ目はタイルの大きさ、みっつめは代表値の選び方、最後の引数はROIの大きさがタイルの大きさの整数倍でなかったときどうするかと言うグラグ。trueだとROIの中だけを処理するが、falseだと整数倍になるようにROIの外にはみ出る。
タイルの中を同じ値で塗りつぶしてしまう処理なので情報は欠落する。でもその欠落具合は代表値の選び方で印象が違う。平均値は見た感じ一番なめらかで、最大値最小値は欠落が大きい感じがする。その他はその間という感じ。ちなみにタイルの真ん中の値を代表値にするのが普段見る「モザイク処理」の感じに一番近い。
もちろんOpenCVなのでムービーにもそのまま使える。ためしにYouTubeで人気の動画にかけてみた。
so-netのデフォルトのページレイアウトでははみ出てしまうので、見やすくするためにYouTubeにジャンプする。OpenCVは音に対して無頓着なので何もしないと音声トラックはカラになる。
僕は普段テレビをほとんど見ないのでなぜこのCMの動画がYouTubeでもてはやされてるのかよく知らないけど、OpenCVの顔認識は顔のピクセル数が小さいと見つけられないので正面向きのバストショットが連続するこういった動画がちょうどいい。ときどき認識に失敗してるけどひとつにはOpenCVにデフォルトでそなわっているカスケードの学習データは傾いた顔に弱いせい。細かいパターンのあるシーンで擬陽性も現れてる。圧縮率が高くてノイズに影響を受けたせいもある。
でもカスケードにはまったく手を加えていないのに認識精度は高い。リアルタイム処理は僕のiMacでは難しくてせいぜい2〜3fpsぐらい。このムービーはオフラインで変換に2分ぐらいかかった。
いいかげん夜中まで遊んでから、他のだれも気がついてないわけないな、と思ってググったらやっぱりやってる人がいっぱいいた。なあんだ。せっかく作ったのに。
ほんとは、画像に尻がみつかるとそこに「しり」と書き込む「田村信処理」というのをやりたかった。これはつる美さんからもらったお題。しかし、尻はあらためて学習する必要があるのにWebにある尻の画像は顔の画像に較べて3〜4桁枚数が少ない。しかも尻は画像としてあまり構造がなく、学習数に対してHarrカスケードのツリーの発達が非常に遅い。尻認識の難しさは顔認識のそれと何桁も違うということになる。残念ながらあきらめた。
なんだまた今日も遅くなってしまったじゃないか。さっさと寝よ。
追記:
女房から家族写真はモザイクがかかっているとはいえ、個人が特定できそうなのでよろしくない、という指摘があった。
たしかにそうかもしれないので、Googleで「家族旅行」で検索して上位に上がったよそ様の写真に差し替えておくことにした。もちろん結果は同じ。
2011-06-21 22:41
nice!(0)
コメント(0)
トラックバック(0)
コメント 0