Grabcut原理见:https://blog.csdn.net/zouxy09/article/details/8534954

grabCut() 函数

cv::grabCut(image,    //输入图像 result,   //分段结果 rectangle, // 包含前景的矩形 bgModel,fgModel, // 前景、背景 1,        // 迭代次数 cv::GC_INIT_WITH_RECT); // 用矩形
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;const char* winTitle = "input image";
Rect rect;
Mat src, image, mask, bgMode, fgMode;
int numRun = 0;
bool init = false;void runGrabcut()
{if (rect.width < 2 || rect.height < 2)return;if (init)grabCut(src, mask, rect, bgMode, fgMode, 1); // 完成第一次的初始化之后,就不需要用矩形了,直接用model了。else{grabCut(src, mask, rect, bgMode, fgMode, 1, GC_INIT_WITH_RECT);init = true;}
}void setROIMask()
{mask.setTo(Scalar(GC_BGD));rect.x = max(0, rect.x);rect.y = max(0, rect.y);rect.width = min(rect.width, src.cols - rect.x);rect.height = min(rect.height, src.rows - rect.y);mask(rect).setTo(Scalar(GC_PR_FGD));
}void showImage()
{Mat result, binMask;binMask.create(mask.size(), CV_8UC1);binMask = mask & 1;if (init)src.copyTo(result, binMask);elsesrc.copyTo(result);rectangle(result, rect, Scalar(0, 0, 255), 2, 8);imshow(winTitle, result);
}void onMouse(int event, int x, int y, int flags, void* param)
{switch (event){case EVENT_LBUTTONDOWN:rect.x = x;rect.y = y;rect.width = 1;rect.height = 1;init = false;numRun = 0;break;case EVENT_MOUSEMOVE: if (flags * EVENT_FLAG_LBUTTON)// 左键按住{rect = Rect(Point(rect.x, rect.y), Point(x, y));showImage();}break;case EVENT_LBUTTONUP:if (rect.width > 1 && rect.height > 1){setROIMask();showImage();}break;default:break;}
}int main()
{src = imread("D:/source/images/flower3.png");if (src.empty()){puts("read image empty");system("pause");return -1;}mask.create(src.size(), CV_8UC1);mask.setTo(Scalar::all(GC_BGD));namedWindow(winTitle, CV_WINDOW_AUTOSIZE);setMouseCallback(winTitle, onMouse);imshow(winTitle, src);while (true){char c = (char)waitKey(0);if (c == 27) break;if (c == 'n'){numRun++;runGrabcut();showImage();printf("numRun = %d\n", numRun);}}return 0;
}


将花扣出来后的效果:

opencv Grabcut-抠图相关推荐

  1. opencv学习笔记五十八:grabCut抠图

    基本步骤: 基于交互式界面由用户选择前景区域: 定义一个单通道的输出掩码,0为背景,1为前景,2为可能的背景,3为可能的前景: grabCut抠图:将输出结果与可能的前景作比较得到可能的前景: 定义三 ...

  2. Python OpenCV GrabCut进行前景分割和提取

    Python OpenCV GrabCut进行前景分割和提取 1. 效果图 1.1 边界框GrabCut效果图 1.2 Mask GrabCut效果图 2. GrabCut原理 2.1 GrabCut ...

  3. opencv grabcut

    使用openc Grabcut效果与 论文效果差别很大,其实opencv grabcut效果与 graph cut效果是一样的.原因是opencv中没有实现 border mattting后续处理 完 ...

  4. OpenCV GrabCut分割的实例(附完整代码)

    OpenCV GrabCut分割的实例 OpenCV GrabCut分割的实例 OpenCV GrabCut分割的实例 #include "opencv2/imgcodecs.hpp&quo ...

  5. OpenCV GrabCut算法前景分割和提取

    目录 一.OpenCv Grabcut算法:前景提取与分割(Foreground segmentation and extraction) (一)算法工作原理 (二)opencv函数cv2.grabC ...

  6. 基于Opencv的抠图

    参考   基于Opencv的抠图 - 云+社区 - 腾讯云 举一个例子,我想要把一张图片中的某一个东西抠出来.如下图: step1:加载图片,转成灰度图. image = cv2.imread(&qu ...

  7. OpenCV GrabCut算法:前景分割和提取

    目录 一.OpenCv Grabcut算法:前景提取与分割(Foreground segmentation and extraction) (一)算法工作原理 (二)opencv函数cv2.grabC ...

  8. OpenCV - GrabCut 算法抠图(Python实现)

    原理 开始时用户需要用一个矩形将前景区域框住(前景区域应该完全被包括在矩形框内部).然后算法进行迭代式分割直达达到最好结果. 函数 mask, bgdModel, fgdModel = cv2.gra ...

  9. python抠图_python和opencv实现抠图

    本文实例为大家分享了python实现抠图的具体代码,供大家参考,具体内容如下 其中使用了opencv中的grabcut方法 直接上代码 # encoding:utf-8 # 图像提取 # create ...

  10. Android 使用opencv实现抠图

    1.openCv配置 从https://github.com/opencv/opencv/releases/tag/3.3.0下载对应的android版本 a.  import module 选择 b ...

最新文章

  1. puppet 自定义facter
  2. React Native --网络请求(fetch)
  3. 第一篇|腾讯开源项目盘点:WeUI,WePY,Tinker,Mars等
  4. android studio 工程demo例子,Android Studio 实现跑马灯微项目实例
  5. idea中event log_【JavaScript 教程】事件——Event 对象
  6. LwIP之数据包管理
  7. python从入门到精通需要多久-Python从入门到精通:一个月就够了
  8. python之作业--------购物车优化
  9. KindEditor富文本编辑从数据库取出来内容回显在页面上会自动增加行间距以及回车换行会自动间距变大的问题...
  10. html图片上传框架,HTML+JS图片上传源码
  11. fastreport oracle,如何从FastReport .NET报表设计器连接到OracleDB数据库
  12. Android下WPS打开Excel2007版也有问题
  13. NUBT 1480 懒惰的风纪委Elaine
  14. python微信抢票脚本_春节到了 教你使用python来抢票回家
  15. 广告行业中那些趣事系列21:从理论到实战BERT知识蒸馏
  16. 工作处境不好的时候,学会三思(三种思考)
  17. 1058: 素数判定
  18. music-音符与常用记号
  19. Window下python安装metis
  20. mysql反掩码_理解通配符掩码

热门文章

  1. 多个域名指向同一主机IP
  2. 微信小程序 云开发 提交表单数据和表单里上传的多张图片一起提交到数据库里完整代码
  3. Rackspace: IT与业务的融合是一门艺术
  4. 23种设计模式-抽象工厂模式《三国王者》
  5. Structure(结构体)
  6. ospf重要内容整理
  7. Centos7 自动化Kickstart+pxe实现无人值守批量安装Linux系统
  8. 提示没有安装JRE插件或者被浏览器拦截的解决方法
  9. 18714 迷宫问题
  10. 腾讯cos 上传php实例,tp5 接入腾讯对象存储COS