トップページ人工知能,実世界DBOpenCV のプログラム例GrabCut 法による前景背景分離を行ってみる(Python を使用)

GrabCut 法による前景背景分離を行ってみる(Python を使用)

【サイト内の関連ページ】

前準備

Python のインストール,pip と setuptools の更新,Python 開発環境

Python の URL: http://www.python.org/

【Python, pip の使い方】

Python, pip は,次のコマンドで起動できる.

Python 開発環境のインストール】

Python 用 opencv-python 4.3 のインストール

Windows の場合

コマンドプロンプトで次のコマンドを実行

python -m pip install -U opencv-python

Ubuntu の場合

端末で次のコマンドを実行

sudo apt -y update
sudo apt -y install libopencv-dev python3-opencv
  • ラズベリーパイ の場合

    端末で次のコマンドを実行

    sudo apt -y update
    sudo apt -y install libopencv-dev python3-opencv python3-opencv-apps
    

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

    画像ファイル home.jpg のダウンロードは, コマンドプロンプト管理者として実行し, 次を実行.

    mkdir c:\image
    cd c:\image
    curl -L https://github.com/opencv/opencv/blob/master/samples/data/home.jpg?raw=true -o home.jpg
    

    上のコマンドがうまく実行できないときは, 別ページを参考にダウンロードを行う.

    https://github.com/opencv/opencv/tree/master/samples/data で公開されている home.jpg を使用する(謝辞:画像の作者に感謝します)

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

    [image]

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

    sample1.mp4

    [image]

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

    GrabCut法による前景分離

    Python プログラムを動かす.

    Python プログラムを動かすために, Windows では「python」, Ubuntu では「python3」などのコマンドを使う.

    あるいは, 開発環境や Python コンソール(Jupyter Qt ConsoleSpyderPyCharmPyScripter など)の利用も便利である.

    あるいは,オンラインで動くGoogle Colaboratory のノートブックの利用も,場合によっては便利である.

    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」, Ubuntu では「python3」などのコマンドを使う.

    あるいは, 開発環境や Python コンソール(Jupyter Qt ConsoleSpyderPyCharmPyScripter など)の利用も便利である.

    あるいは,オンラインで動くGoogle Colaboratory のノートブックの利用も,場合によっては便利である.

    ビデオファイル

    import cv2
    import numpy as np
    
    IMROOT="C:/image/"
    v = cv2.VideoCapture(IMROOT + "sample1.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」のキーを押して閉じる