トップページ -> 最新情報技術の実習と研究ツール -> OpenCV と Python によるコンピュータビジョン、画像処理 -> GrabCut 法による前景背景分離を行ってみる
[サイトマップへ]

GrabCut 法による前景背景分離を行ってみる

サイト内の関連Webページ


前準備

Anaconda のインストール

前準備として,Python 開発環境のAnaconda のインストールが終わっていること.

以下,Windows に Anaconda をインストール済みであるものとして説明を続けます.

OpenCV, spyder パッケージのインストール

Windows では次の手順で行う

  1. Window でコマンドプロンプトを実行

  2. OpenCV, spyder パッケージのインストール

    ※ 「conda install」は、パッケージをインストールするためのコマンド

    conda install -y spyder opencv 
    

この Web ページで説明のために使用する画像

https://github.com/opencv/opencv/tree/master/samples/data で公開されている home.jpg を使うことにします (感謝)

  1. まず、C:\image のような作業用のディレクトリ(フォルダ)を作る
  2. 次の Web ページを開く

    https://github.com/opencv/opencv/tree/master/samples/data

  3. home.jpg を選ぶ

  4. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.

  5. 画像ファイルを、C:\image の下に保存

  6. 上と同じ手順で aloeL.jpg, alorR.jpg の2つもダウンロードし、C:\image の下に保存

顔が写ったビデオファイル

sample2.mp4 (30秒)

sample2.mp4 を、C:\image の下に保存


GrabCut法による前景分離

Python プログラムを動かしたい.

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

import numpy as np
import cv2
bgr = cv2.imread("C:/image/home.jpg")
h, w = bgr.shape[:2]
mask = np.zeros((h,w), dtype = np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect=(1,1,w,h)
cv2.grabCut(bgr, mask, rect, bgdModel, fgdModel, 10, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
bgr2 = bgr*mask2[:,:,np.newaxis]
cv2.imshow("bgr", bgr)
cv2.imshow("bgr2", bgr2)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

別の画像で試す

import numpy as np
import cv2
bgr = cv2.imread("C:/image/aloeL.jpg")
h, w = bgr.shape[:2]
mask = np.zeros((h,w), dtype = np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect=(1,1,w,h)
cv2.grabCut(bgr, mask, rect, bgdModel, fgdModel, 10, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
bgr2 = bgr*mask2[:,:,np.newaxis]
cv2.imshow("bgr", bgr)
cv2.imshow("bgr2", bgr2)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる


ビデオについて行う

Python プログラムを動かしたい.

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

ビデオファイル

import cv2
import numpy as np

v = cv2.VideoCapture("C:/image/sample2.mp4")
while(v.isOpened()):
    r, bgr = v.read()
    if ( r == False ):
        break
    h, w = bgr.shape[:2]
    mask = np.zeros((h,w), dtype = np.uint8)
    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)
    rect=(1,1,w,h)
    cv2.grabCut(bgr, mask, rect, bgdModel, fgdModel, 10, cv2.GC_INIT_WITH_RECT)
    mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
    bgr2 = bgr*mask2[:,:,np.newaxis]
    cv2.imshow("bgr", bgr)
    cv2.imshow("bgr2", bgr2)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

パソコン接続ビデオカメラ

パソコン接続できるビデオカメラを準備し,パソコンに接続しておく.

※「v = cv2.VideoCapture(0)」に変えただけ

import cv2
import numpy as np

v = cv2.VideoCapture(0)
while(v.isOpened()):
    r, f = v.read()
    if ( r == False ):
        break
    h, w = f.shape[:2]
    mask = np.zeros((h,w), dtype = np.uint8)
    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)
    rect=(1,1,w,h)
    cv2.grabCut(f, mask, rect, bgdModel, fgdModel, 10, cv2.GC_INIT_WITH_RECT)
    mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
    img2 = f*mask2[:,:,np.newaxis]
    cv2.imshow("f", f)
    cv2.imshow("img2", img2)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる