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代码:
mode == cv::GC_INIT_MASK的代码:
代码来源:..\OpenCV\VS2012\05\Morphological\ErodeAndDilate_5.cpp
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
相关文章推荐
- DEDE整合套件实现本地多个网站随意切换的开发环境
- solr与tomcat整合
- 如何在电脑上测试手机网站
- Linux开发工具_3_Makefile入门(上)
- 关闭或开启Linux上的iptables防火墙,SSH端口
- DEDECMS5.7将data目录迁移后,网站地图无法打开和更新的解决方法
- 自定义Dialog几个Popup window.
- linux socket 编程
- 觉得还不错的修改过的网站前台模板,这里分享给大家。
- 探寻Top20创业失败缘由
- WordPress网站迁移
- tomcat 6 发布应用后,访问jsp报错org.apache.jasper.JasperException: java.lang.NullPointerException的解决办法。
- 如何在电脑上测试手机网站(全)
- delete from tablename与drop table tablename区别
- Linux下rz,sz与ssh的配合使用
- openlldp-0.4alpha实现详解(五)——tx_sm模块
- centos6.3源码安装mysql-5.5.34
- Hadoop基准测试
- 《高效学习OpenGL》 之 雾 glFog(), glFogCoordf()
- Linux SSH管理用户登录