OpenCV で GrabCut 法による前景背景分離を行ってみる(Python を使用)
【関連する外部ページ】
- OpenCV の公式ページ: https://opencv.org
- GitHub の OpenCV のページ: https://github.com/opencv/opencv/releases
【サイト内の関連ページ】
- OpenCV について [PDF] , [パワーポイント]
- OpenCVとPythonを活用した画像・ビデオ処理プログラム: 別ページ »
前準備
Python のインストール(Windows,Ubuntu 上)
- Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール(winget を使用しないインストール): 別ページ »で説明
- Ubuntu では,システム Pythonを使うことができる.Python3 開発用ファイル,pip, setuptools のインストール: 別ページ »で説明
【サイト内の関連ページ】
- Python のまとめ: 別ページ »にまとめ
- Google Colaboratory の使い方など: 別ページ »で説明
【関連する外部ページ】 Python の公式ページ: https://www.python.org/
Python 開発環境のインストール
- Windows での Python 開発環境として,Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, spyder のインストール: 別ページ »で説明
- Windows での PyCharm のインストール: 別ページ »で説明
- Windows での PyScripter のインストール: 別ページ »で説明
OpenCV Python のインストール
Python で OpenCV を動かすためのもの.
OpenCV Python のインストールは:別ページ »で説明1~2 コマンドの実行でインストールできる.
このページで説明のために使用する画像
画像ファイル 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 を使用する(謝辞:画像の作者に感謝します)
sample1.mp4
を、C:\image の下に保存
Python プログラムの実行
Python 開発環境(Jupyter Qt Console,
Jupyter ノートブック (Jupyter Notebook),
Jupyter Lab,
Nteract,
Spyder,
PyCharm,
PyScripterなど)も便利である.
Python のまとめ: 別ページ »にまとめ
画像が表示されるので確認.
このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
別の画像で試す
画像が表示されるので確認.
このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
Python プログラムの実行
Python 開発環境(Jupyter Qt Console,
Jupyter ノートブック (Jupyter Notebook),
Jupyter Lab,
Nteract,
Spyder,
PyCharm,
PyScripterなど)も便利である.
Python のまとめ: 別ページ »にまとめ
OpenCV による動画表示を行う.
* 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる
パソコン接続できるビデオカメラを準備し,パソコンに接続しておく.
*「v = cv2.VideoCapture(0)」に変えただけ
* 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる
顔が写った動画ファイル
GrabCut法による前景分離
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()
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()
ビデオについて行う
python
動画ファイル
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)
# Press Q to exit
if cv2.waitKey(1) & 0xFF == ord('q'):
break
v.release()
cv2.destroyAllWindows()
パソコン接続ビデオカメラ
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)
# Press Q to exit
if cv2.waitKey(1) & 0xFF == ord('q'):
break
v.release()
cv2.destroyAllWindows()