質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

769閲覧

OpenCv上でチョココーティングを実現したい

退会済みユーザー

退会済みユーザー

総合スコア0

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/19 13:37

環境はvisual studioのC++で行っています。

OpenCvを用いて認識した物体にチョコレートをコーティングするようなプログラムを作成したいです。
初心者であるためどのようにすればチョコを再現できるのか検討がつきません。色を変えるだけでは上手く再現出来ず、何も思いつきません。何か良いアイデアはあるでしょうか?
(イメージはチョコバナナやチョコドーナツなど食べ物にチョコレートをまとわりつかせているようなものです)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

新しいやり方(領域選択も加工もすべて自動化)

(C++のサンプルはなさそうですがPythonであればすぐにポン付けで実装できると思います)

恐らく、物体認識をして塗りつぶして、というやり方で「汎用性が高い加工」は困難だと思います。詳細は以下の古いやり方を参照ください。

本命のやり方はCycleGANです。
リンク先の馬をシマウマに変えてしまう例が分かりやすいと思います。

大量に「対象物の画像」と「チョコがついた対象物の画像」を用意して、あとはGPUに食わせる感じです。こちらの日本語の解説が分かりやすいと思います。

加工前と加工後で映り方の視点を同じにする必要はないようですので、改正後の日本の著作権法に従えば、サイト上の規約に沿った範囲内で日本のWEBサーバー上にある画像データを適当に検索してDLする分には問題ないと思います。

大量にバナナの写真と、チョコバナナの写真を用意して、これを学習させれば、バナナを見せた写真がチョコバナナに化けるソフトの完成です。

古いやり方(領域を選択して加工する)

一番初めにやらないといけないのは、物体の認識です。

物体の認識といってもたくさん方法があり、

  1. 幾何学的な形状(丸い、直線等)から特定であれば、OpenCVのハフ検出が便利です。
  2. 色をベースにblob検出をする(HSVスケールであれば、OpenCVのinRangeで多少の幅を持って検出できるはずです)
  3. 形が決まりきっているのであれば、OpenCVのmatchTemplateを使って物体を認識ができます。
  4. 形は大体決まっているけれども揺らぎがある(顔など)であれば、OpenCVのHAAR-LIKEなどを使った統計的なパターン認識が使えるはずです。
  5. 形も大きさも色も結構な違いがあって一概に認識させるのが難しいのであれば、深層学習によるセマンティックセグメンテーション(映っているものがどういう形の何かを領域ごとに特定)が必要です。

1-3はそれほど準備をしなくてもすぐに使えますが、ロバスト性は高くありません。
4ではロバスト性は上がりますが教師データの用意が必要です。
5に関してはロバスト性は抜群に上がりますが、教師データは必須となりますがPythonでやった方がやりやすいと思います(C++でできなくはないと思いますがいばらの道と思います)。

次にやらないといけないのは、**物体の塗りつぶし(それっぽい塗り方)**です。
上記で検出した領域それぞれに対して塗りつぶすか、addWeightedで透過させながら色を重ねるかが使いやすくなります。

が、恐らく

色を変えるだけでは上手く再現出来ず、何も思いつきません

に行き着いてしまいます。恐らく塗るときに「塗りつぶし」ではだめで、「グラデーション処理」が必要だったり、形状(奥行?)などを加味しながら「グレアを再現」したりしないとそれっぽくなりません。
ここまでを自動でやるのはしんどいと思います。

投稿2021/08/19 22:09

編集2021/08/19 22:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/08/20 01:58

> 恐らく塗るときに「塗りつぶし」ではだめで、「グラデーション処理」が必要だったり... 元の物体像にも相応に陰影があるでしょうから, 各小領域毎に,手持ちの(事前に用意した)大量の「チョココーティング表面小画像片」の中から陰影具合が似ているやつを選んできては張り付ける 的な方法である程度頑張れたりしないかなぁ? とか思いました. (張り付けた境界の不連続さに関しては,適当なブレンドなりぼかし処理でごまかす:相手が「チョココーティング」なら妙に滑らかな感じになっても違和感がないかなと)
退会済みユーザー

退会済みユーザー

2021/08/20 15:13

確かに塗りつぶすよりfanaさんの切り口(過去の画像から似た部分を抜き取って切り貼り)の方がエレガントな仕上がりになりそうです。同じような考え方で、深度情報も加味できれば似たような凹凸具合も反映してより自然になるかもしれませんね。(が、私にはどうやったらできそうかまで落とし込める技量がありません ありませんo_0)
fana

2021/08/21 02:47

認識側の難易度の方が厳しい問題に思います. (チョコにする処理は所詮は映像クオリティの問題(?)だし) セマンティックセグメンテーションなんて 結果例見せられると「なにこれすごい」ってなるけど どうやってあれが達成されてるのか1ミリもわからない^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問