您的位置:首页 > 运维架构

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

2014-02-21 17:56 411 查看
函数: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 <imgproc\imgproc.hpp>

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 <imgproc\imgproc.hpp>

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: