OpenCV画像分割cv::grabCut()関数
関数:void grabCut(InputArray img,InputOutputArray mask,Rect rect,InputOutputArray bgdModel,InputOutputArray fgdModel,
int iterCount, int mode = GC_EVAL );
パラメータ:
img:入力画像
mask:マスクマトリクスが得られ、その値は以下の4種類である.
cv::GC_BGD==0//は背景を表す
cv::GC_FGD==1//は前景を表す
cv::GC_PR_BGD==2//表示はバックグラウンドである可能性がある
cv::GC_PR_FGD==3//表示は前景である可能性がある
rect:指定したターゲットオブジェクトを含むマトリクス
bdgModel:nullの場合、関数の内部にbgdModelが自動的に作成されます.bgdModelは単一チャネル浮動小数点型(CV_32 FC 1)画像でなければならず、行数は1のみ、列数は13*5のみである.
fgdModel:nullの場合、関数の内部にfgdModelが自動的に作成されます.fgdModelは単一チャネル浮動小数点型(CV_32 FC 1)画像でなければならず、行数は1のみ、列数は13 x 5のみである.(bgdModel,fgdModelはcv::GC_INIT_WITH_MASKで使用でき、従来の反復に基づいて保存した情報で反復を継続できる)
iterCount:反復回数の指定
mode:使用可能な値は3つあります
cv::GC_INIT_WITH_RECT//マトリクスでgrabCutを初期化
cv::GC_INIT_WITH_MASK//マスクでgrabCutを初期化
cv::GC_EVAL//分割の実行
mode == cv::GC_INIT_WITH_RECTコード:
mode == cv::GC_INIT_MASKのコード:
コードソース:..\OpenCV\VS2012\05\Morphological\ErodeAndDilate_5.cpp
int iterCount, int mode = GC_EVAL );
パラメータ:
img:入力画像
mask:マスクマトリクスが得られ、その値は以下の4種類である.
cv::GC_BGD==0//は背景を表す
cv::GC_FGD==1//は前景を表す
cv::GC_PR_BGD==2//表示はバックグラウンドである可能性がある
cv::GC_PR_FGD==3//表示は前景である可能性がある
rect:指定したターゲットオブジェクトを含むマトリクス
bdgModel:nullの場合、関数の内部にbgdModelが自動的に作成されます.bgdModelは単一チャネル浮動小数点型(CV_32 FC 1)画像でなければならず、行数は1のみ、列数は13*5のみである.
fgdModel:nullの場合、関数の内部にfgdModelが自動的に作成されます.fgdModelは単一チャネル浮動小数点型(CV_32 FC 1)画像でなければならず、行数は1のみ、列数は13 x 5のみである.(bgdModel,fgdModelはcv::GC_INIT_WITH_MASKで使用でき、従来の反復に基づいて保存した情報で反復を継続できる)
iterCount:反復回数の指定
mode:使用可能な値は3つあります
cv::GC_INIT_WITH_RECT//マトリクスでgrabCutを初期化
cv::GC_INIT_WITH_MASK//マスクでgrabCutを初期化
cv::GC_EVAL//分割の実行
mode == cv::GC_INIT_WITH_RECTコード:
#pragma once
#include "highgui.h"
#include
int main()
{
cv::Mat image = cv::imread("D:/Development/OpenCV/images/group.jpg") ;
cv::Rect rectangle(10 , 100 , 380 , 180) ;//
cv::Mat result ;
cv::Mat bgModel , fgModel ;
//grabCut() cv::GC_INIT_WITH_RECT
cv::grabCut(image , result , rectangle , bgModel , fgModel , 5 ,
cv::GC_INIT_WITH_RECT) ;
cv::compare(result , cv::GC_PR_FGD , result , cv::CMP_EQ) ;
//result = result & 1 ;
cv::Mat foreground(image.size() , CV_8UC3 ,
cv::Scalar(128 , 128 , 128)) ;
image.copyTo(foreground , result) ;
cv::imshow("Foreground" , foreground) ;
cv::waitKey(0) ;
return 0 ;
}
mode == cv::GC_INIT_MASKのコード:
#pragma once
#include "highgui.h"
#include
int main()
{
cv::Mat image = cv::imread("D:/Development/OpenCV/images/group.jpg") ;
cv::Rect rectangle(10 , 100 , 380 , 180) ;
cv::Mat result ;
cv::Mat bgModel , fgModel ;
//grabCut() cv::GC_INIT_WITH_MASK
result= cv::Mat(image.rows, image.cols,CV_8UC1, cv::Scalar(cv::GC_BGD));
cv::Mat roi(result, rectangle);
roi = cv::Scalar(cv::GC_PR_FGD);
// ( bgModel , fgModel )
cv::grabCut(image , result , rectangle , bgModel , fgModel , 1 ,
cv::GC_INIT_WITH_MASK) ;
cv::grabCut(image , result , rectangle , bgModel , fgModel , 4 ,
cv::GC_INIT_WITH_MASK) ;
cv::compare(result , cv::GC_PR_FGD , result , cv::CMP_EQ) ;
//result = result & 1 ;
cv::Mat foreground(image.size() , CV_8UC3 ,
cv::Scalar(128 , 128 , 128)) ;
image.copyTo(foreground , result) ;
cv::imshow("Foreground" , foreground) ;
cv::waitKey(0) ;
return 0 ;
}
コードソース:..\OpenCV\VS2012\05\Morphological\ErodeAndDilate_5.cpp