OpenCV图像分割cv::grabCut()函数

函数:void grabCut( InputArray img, InputOutputArray mask, Rect rect,
                           InputOutputArray bgdModel, InputOutputArray fgdModel,

                           int iterCount, int mode = GC_EVAL );

参数:

img:输入图像

mask:得到掩码矩阵,其值为以下四种

             cv::GC_BGD  == 0//表示是背景

             cv::GC_FGD  == 1//表示是前景

              cv::GC_PR_BGD  == 2//表示可能是背景

              cv::GC_PR_FGD  == 3//表示可能是前景

rect:指定的包含目标对象的矩阵

bdgModel:背景模型,如果为null,函数内部会自动创建一个bgdModel;bgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13*5

fgdModel:前景模型,如果为null,函数内部会自动创建一个fgdModel;fgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13x5;(bgdModel , fgdModel可以在 cv::GC_INIT_WITH_MASK下使用,可以在以往迭代的基础上用它们保存的信息继续迭代)

iterCount:指定迭代次数

mode:有三个值可用

          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

你可能感兴趣的:(C++,OpenCV)