OpenCV画像分割cv::grabCut()関数

2807 ワード

関数: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コード:
#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