新しいやり方(領域選択も加工もすべて自動化)
(C++のサンプルはなさそうですがPythonであればすぐにポン付けで実装できると思います)
恐らく、物体認識をして塗りつぶして、というやり方で「汎用性が高い加工」は困難だと思います。詳細は以下の古いやり方を参照ください。
本命のやり方はCycleGANです。
リンク先の馬をシマウマに変えてしまう例が分かりやすいと思います。
大量に「対象物の画像」と「チョコがついた対象物の画像」を用意して、あとはGPUに食わせる感じです。こちらの日本語の解説が分かりやすいと思います。
加工前と加工後で映り方の視点を同じにする必要はないようですので、改正後の日本の著作権法に従えば、サイト上の規約に沿った範囲内で日本のWEBサーバー上にある画像データを適当に検索してDLする分には問題ないと思います。
大量にバナナの写真と、チョコバナナの写真を用意して、これを学習させれば、バナナを見せた写真がチョコバナナに化けるソフトの完成です。
古いやり方(領域を選択して加工する)
一番初めにやらないといけないのは、物体の認識です。
物体の認識といってもたくさん方法があり、
- 幾何学的な形状(丸い、直線等)から特定であれば、OpenCVのハフ検出が便利です。
- 色をベースにblob検出をする(HSVスケールであれば、OpenCVのinRangeで多少の幅を持って検出できるはずです)
- 形が決まりきっているのであれば、OpenCVのmatchTemplateを使って物体を認識ができます。
- 形は大体決まっているけれども揺らぎがある(顔など)であれば、OpenCVのHAAR-LIKEなどを使った統計的なパターン認識が使えるはずです。
- 形も大きさも色も結構な違いがあって一概に認識させるのが難しいのであれば、深層学習によるセマンティックセグメンテーション(映っているものがどういう形の何かを領域ごとに特定)が必要です。
1-3はそれほど準備をしなくてもすぐに使えますが、ロバスト性は高くありません。
4ではロバスト性は上がりますが教師データの用意が必要です。
5に関してはロバスト性は抜群に上がりますが、教師データは必須となりますがPythonでやった方がやりやすいと思います(C++でできなくはないと思いますがいばらの道と思います)。
次にやらないといけないのは、**物体の塗りつぶし(それっぽい塗り方)**です。
上記で検出した領域それぞれに対して塗りつぶすか、addWeightedで透過させながら色を重ねるかが使いやすくなります。
が、恐らく
色を変えるだけでは上手く再現出来ず、何も思いつきません
に行き着いてしまいます。恐らく塗るときに「塗りつぶし」ではだめで、「グラデーション処理」が必要だったり、形状(奥行?)などを加味しながら「グレアを再現」したりしないとそれっぽくなりません。
ここまでを自動でやるのはしんどいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/20 01:58
退会済みユーザー
2021/08/20 15:13
2021/08/21 02:47