opencv Grabcut-抠图
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-抠图相关推荐
- opencv学习笔记五十八:grabCut抠图
基本步骤: 基于交互式界面由用户选择前景区域: 定义一个单通道的输出掩码,0为背景,1为前景,2为可能的背景,3为可能的前景: grabCut抠图:将输出结果与可能的前景作比较得到可能的前景: 定义三 ...
- Python OpenCV GrabCut进行前景分割和提取
Python OpenCV GrabCut进行前景分割和提取 1. 效果图 1.1 边界框GrabCut效果图 1.2 Mask GrabCut效果图 2. GrabCut原理 2.1 GrabCut ...
- opencv grabcut
使用openc Grabcut效果与 论文效果差别很大,其实opencv grabcut效果与 graph cut效果是一样的.原因是opencv中没有实现 border mattting后续处理 完 ...
- OpenCV GrabCut分割的实例(附完整代码)
OpenCV GrabCut分割的实例 OpenCV GrabCut分割的实例 OpenCV GrabCut分割的实例 #include "opencv2/imgcodecs.hpp&quo ...
- OpenCV GrabCut算法前景分割和提取
目录 一.OpenCv Grabcut算法:前景提取与分割(Foreground segmentation and extraction) (一)算法工作原理 (二)opencv函数cv2.grabC ...
- 基于Opencv的抠图
参考 基于Opencv的抠图 - 云+社区 - 腾讯云 举一个例子,我想要把一张图片中的某一个东西抠出来.如下图: step1:加载图片,转成灰度图. image = cv2.imread(&qu ...
- OpenCV GrabCut算法:前景分割和提取
目录 一.OpenCv Grabcut算法:前景提取与分割(Foreground segmentation and extraction) (一)算法工作原理 (二)opencv函数cv2.grabC ...
- OpenCV - GrabCut 算法抠图(Python实现)
原理 开始时用户需要用一个矩形将前景区域框住(前景区域应该完全被包括在矩形框内部).然后算法进行迭代式分割直达达到最好结果. 函数 mask, bgdModel, fgdModel = cv2.gra ...
- python抠图_python和opencv实现抠图
本文实例为大家分享了python实现抠图的具体代码,供大家参考,具体内容如下 其中使用了opencv中的grabcut方法 直接上代码 # encoding:utf-8 # 图像提取 # create ...
- Android 使用opencv实现抠图
1.openCv配置 从https://github.com/opencv/opencv/releases/tag/3.3.0下载对应的android版本 a. import module 选择 b ...
最新文章
- puppet 自定义facter
- React Native --网络请求(fetch)
- 第一篇|腾讯开源项目盘点:WeUI,WePY,Tinker,Mars等
- android studio 工程demo例子,Android Studio 实现跑马灯微项目实例
- idea中event log_【JavaScript 教程】事件——Event 对象
- LwIP之数据包管理
- python从入门到精通需要多久-Python从入门到精通:一个月就够了
- python之作业--------购物车优化
- KindEditor富文本编辑从数据库取出来内容回显在页面上会自动增加行间距以及回车换行会自动间距变大的问题...
- html图片上传框架,HTML+JS图片上传源码
- fastreport oracle,如何从FastReport .NET报表设计器连接到OracleDB数据库
- Android下WPS打开Excel2007版也有问题
- NUBT 1480 懒惰的风纪委Elaine
- python微信抢票脚本_春节到了 教你使用python来抢票回家
- 广告行业中那些趣事系列21:从理论到实战BERT知识蒸馏
- 工作处境不好的时候,学会三思(三种思考)
- 1058: 素数判定
- music-音符与常用记号
- Window下python安装metis
- mysql反掩码_理解通配符掩码