Python

PythonでOpenCV~GrabCut(前景抽出)~

  • このエントリーをはてなブックマークに追加

OpenCVのデモコードGrabCutを解説

OpenCVのGrabCutを使った対話的前景領域抽出が分からない…そこで、実際にデモコードを動かしてみました。 前景抽出チュートリアルでやってる事はこのような感じです。

cat_result

環境

OpenCVの環境は整ってるとします。今、私が使っている環境は

  • OS Windows7
  • Python 2.7.13
  • OpenCV 2.4.12

準備

  • 前景抽出する画像の準備
  • サンプルコードgrabcut.pyをダウンロード

前景抽出する画像の準備

この画像を作業ディレクトリにcat.jpgという名前で作業ディレクトリに保存してください。

cat

サンプルコードgrabcut.pyをダウンロード

今回の主役であるサンプルコードgrabcut.pyを入手しましょう。
OpenCV/grapcutから「Rawボタンを右クリック->名前を付けてリンク先を保存」でダウンロードできます。ダウンロードしたファイルを作業ディレクトリに移動しておきましょう。

gh
ひとまず、作業ディレクトリが次のようになっていればOKです。
grabcut

サンプルコードを動かしてみる。

コマンドプロンプト起動させて作業ディレクトリへ移動します。

cd 作業ディレクトリのパス

前景抽出したい画像のパス(cat.jpg)を引数にgrabcutを実行すると…

Python grapcut.py cat.jpg 

2つのウィンドウが新たに表示されます。
grabcut1

表示されているメッセージを読むと
grabcut3

“Draw a rectangle around the object using right mouse button”
「マウスの右ボタンで(inputのウィンドウ内で前景を囲む)長方形を書きましょう。」

とのことなので、右クリックして青い枠で前景を囲みます。

grabcut4

“Now press the key ‘n’ a few times until no further change”
「’n’を押すと画像が変化します。」

となっているので”n”をキーボードから入力するとoutputウィンドウに背景が黒塗りになった画像が表示されます。

grabcut5

けれど、芝生の部分が前景と認識されていたり、猫の右側がえぐれています。表示されている説明を読むと…

grabcut3

“key ‘0’ – To select areas of sure background”
「0を押すと背景が選択できます。」
“key ‘1’ – To select areas of sure foreground”
「1を押すと前景が選択できます。」
“key ‘2’ – To select areas of probable background”
「2を押すと背景らしいところが選択できます。」
“key ‘3’ – To select areas of probable foreground”
「3を押すと前景らしいところが選択できます。」

と書いているので微調整を行います。
まず、前景と認識されている芝生を背景にしましょう。
input画面を選択して0を押してマウスの左ボタンで芝生の部分を適当に塗る。

grabcut6

そして”n”を押すと、猫の前景が抽出される

grabcut7

少し気になるのが右ひげの部分を前景に入れたい…
そこで役立つのが前景選択!今度は1を押してマウスの左ボタンでひげの部分を書いて”n”を押してみる。するとひげの部分が復活!

grabcut8
一応、これで完成!

“s”を押して結果画像を保存する。すると次のようなgrapcut_output.pngというファイルが作業ディレクトリ内に保存されまず。最後にEscキーで終了しましょう。

grabcut_output
左が元の画像、真ん中が入力した内容、右が出力結果になっている。
次回はもっと使いやすいようにサンプルコードを書き換える予定。

  • このエントリーをはてなブックマークに追加