↓もし、良かったらSNSでの紹介よろしくお願いします。

前景領域抽出ツール作成OpenCV

bootstrap

本ツールは以前紹介したOpenCVのgrapcut.pyをベースに作成してます。まずはじめに、grabcut.pyをOpenCVのソースからダウンロードしておきましょう。
grabcutの紹介

ウィンドウがサイズ変更できなくて使いにくい…

grapcutのサンプルコードのウィンドウサイズが画像のサイズに応じて固定になってしまいます。大きい画像を編集する場合などはすごく使い勝手が悪いのでウィンドウを一般なウィンドウ同様、大きさの調整が可能なように書き換えましょう。

120    cv2.namedWindow('output')
121    cv2.namedWindow('input')

となっているところを

120    cv2.namedWindow('output', cv2.WINDOW_NORMAL)
121    cv2.namedWindow('input', cv2.WINDOW_NORMAL)

と書き換えるだけです。

作業の過程を3つ(入力、出力、マスク)に分けて保存したい。

この作業は次の3つに分けて解説します。

  • 保存先のフォルダを作る
  • 作業の番号をつける
  • 画像を保存する

保存先のフォルダを作る

3つの画像を闇雲に保存した場合、ファイル数が多くなってしまうので、まず保存先のフォルダを作りましょう。フォルダ名は画像のファイル名から拡張子を取ったものとします。

33 import numpy as np
34 import cv2
35 import sys

フォルダを作るosモジュールがインポートされていないのでインポートしましょう。

33 import numpy as np
34 import cv2
35 import sys
36 import os

次はフォルダ生成のコードを書きます。

108    if len(sys.argv) == 2:
109        filename = sys.argv[1] # for drawing purposes

ここでファイル名を取得しているので、ここでフォルダを生成しましょう。

108    if len(sys.argv) == 2:
109        filename = sys.argv[1] # for drawing purposes
110        workDir = filename[:filename.rfind(".")]

まずは、ファイルネームからフォルダ名(workDir)を作ります。

111        if not os.path.exists(workDir):
112            os.mkdir(workDir)

フォルダがあるか確認して生成します。

作業の番号をつける。

作業に番号をつけていきましょう。’n’を押すたびに作業内容が3つのファイル(input1.png、output1.png、mask1.png)のように保存されるようにしていきます。先ほど追加した箇所の直後に作業番号(workCount)の初期値を設定しておきましょう。

111        if not os.path.exists(workDir):
112            os.mkdir(workDir)
113       workCount = 0

‘n’を押すたびにworkCountが1ずつ増えていくように設定しましょう。次のようにコードを挿入すればいいです。

168        elif k == ord('n'): # segment the image
169            workCount += 1

画像を保存する

そして、3つの画像を保存します。

181        cv2.imwrite(workDir + "\\input" + str(workCount) + ".png", img)
182        cv2.imwrite(workDir + "\\output" + str(workCount) + ".png", output)
183        cv2.imwrite(workDir + "\\mask" + str(workCount) + ".png", mask2)

背景色を黒ではなく透明にしたい…

サンプルコードで保存するとoutputの背景色が黒になってしまいます。透明色で保存するようにしましょう。

181            bgr = cv2.split(img2)
182            bgra = bgr + [mask2]
183            output_alpha = cv2.merge(bgra)
184            cv2.imwrite(work_dir + "\\input" + str(work_count) + ".png", img)
185            cv2.imwrite(work_dir + "\\output" + str(work_count) + ".png", output_alpha)
186            cv2.imwrite(work_dir + "\\mask" + str(work_count) + ".png", mask2)

‘q’を押すと終了する

終了するコマンドが無いので追加しておきます。

187        elif k == ord('q'):
188            break

↓もし、良かったらSNSでの紹介よろしくお願いします。

フォローする