トップページ -> データベース関連技術 -> OpenCV と Python によるコンピュータビジョン、画像処理 -> GrabCut 法による前景背景分離を行ってみる
[サイトマップへ], [サイト内検索へ]

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

サイト内の関連ページ


前準備

Python のインストール

Python 3 用 opencv-python, matplotlib, numpy パッケージのインストール


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

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

  1. まず、C:\image のような作業用のディレクトリ(フォルダ)を作る

    [image]
  2. 次の Web ページを開く

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

  3. home.jpg を選ぶ

    [image]
  4. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.
  5. 画像ファイルを、C:\image の下に保存
  6. 上と同じ手順で aloeL.jpg, alorR.jpg の2つもダウンロードし、C:\image の下に保存

    [image]

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

    sample2.mp4 (30秒)

    [image]

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


GrabCut法による前景分離

Python プログラムを動かす.

※ Python プログラムを動かすために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある Python コンソールも便利である.

import numpy as np
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

別の画像で試す

import numpy as np
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + 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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]


ビデオについて行う

Python プログラムを動かす.

※ Python プログラムを動かすために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある Python コンソールも便利である.

ビデオファイル

import cv2
import numpy as np

IMROOT="C:/image/"
v = cv2.VideoCapture(IMROOT + "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()

[image]

※ 止めたいとき,右上の「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」のキーを押して閉じる


本サイトは金子邦彦研究室のWebページです.サイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.

問い合わせ先: 金子邦彦(かねこ くにひこ) [image]