我的编程空间,编程开发者的网络收藏夹
学习永远不晚

OpenCV中怎么使用GrabCut实现抠图功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

OpenCV中怎么使用GrabCut实现抠图功能

这篇文章主要讲解了“OpenCV中怎么使用GrabCut实现抠图功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV中怎么使用GrabCut实现抠图功能”吧!

1、概述

grabCut( InputArray img, InputOutputArray mask, Rect rect,                           InputOutputArray bgdModel, InputOutputArray fgdModel,                           int iterCount, int mode = GC_EVAL );
  • img --> 输入的三通道图像;

  • mask --> 输入的单通道图像,初始化方式为GC_INIT_WITH_RECT表示ROI区域可以被初始化为:

  • GC_BGD --> 定义为明显的背景像素 0

  • GC_FGD --> 定义为明显的前景像素 1

  • GC_PR_BGD --> 定义为可能的背景像素 2

  • GC_PR_FGD --> 定义为可能的前景像素 3

  • rect --> 表示roi区域;

  • bgdModel --> 表示临时背景模型数组;

  • fgdModel --> 表示临时前景模型数组;

  • iterCount --> 表示图割算法迭代次数, 次数越多,效果越好;

  • mode --> 当使用用户提供的roi时候使用GC_INIT_WITH_RECT

实现算法的步骤:

创建一个遮罩,并初始化为背景GC_BGD

用户选定一个ROI区域初始化为前景GC_FGD

调用grabCut函数实现算法

输入mask即为目标抠图

2、代码示例

(这个例子不完善,图像的颜色输出有问题,先记录一下,后面改正。但是不影响整个算法的流程及效果,仅仅是RGB和BGR像素通道的问题)

CrabCut_Matting::CrabCut_Matting(QWidget *parent)    : MyGraphicsView{parent}{    this->setWindowTitle("crabCut抠图");    this->setMouseTracking(true);//设置鼠标事件可用    init = false;    numRun = false;}  void CrabCut_Matting::dropEvent(QDropEvent*event){    QString filePath = event->mimeData()->urls().at(0).toLocalFile();    showCrabCutMatting(filePath.toStdString().c_str());} void CrabCut_Matting::showCrabCutMatting(const char* filePath){    class="lazy" data-src = imread(filePath);    if(class="lazy" data-src.empty()){        qDebug()<<"输入图像为空";        return;    }     //创建一个背景遮罩    mMask = Mat::zeros(class="lazy" data-src.size(),CV_8UC1);    mMask.setTo(Scalar::all(GC_BGD));      convert2Sence(class="lazy" data-src);}void CrabCut_Matting::mouseMoveEvent(QMouseEvent *event){    //    if(event->button()==Qt::LeftButton){//鼠标左键    rect = Rect(Point(rect.x, rect.y), Point(event->pos().x(), event->pos().y()));    qDebug()<<"mouseMoveEvent:"<<rect.width<<"|"<<rect.height;    showImage();    //    }} void CrabCut_Matting::mousePressEvent(QMouseEvent *event){    grabMouse();    if(event->button()==Qt::LeftButton){//鼠标左键        rect.x = event->pos().x();        rect.y = event->pos().y();        rect.width = 1;        rect.height = 1;        init = false;        numRun = 0;        qDebug()<<"mousePressEvent:"<<event->pos().x()<<"|"<<event->pos().y();    } } void CrabCut_Matting::mouseReleaseEvent(QMouseEvent *event){    releaseMouse();    if(event->button()==Qt::LeftButton){//鼠标左键        if (rect.width > 1 && rect.height > 1) {            setROIMask();            qDebug()<<"mouseReleaseEvent:"<<rect.width<<"|"<<rect.height;            //执行grabcut的代码            runGrabCut();            numRun++;            showImage();        }     }}void CrabCut_Matting::setROIMask(){    // GC_FGD = 1    // GC_BGD =0;    // GC_PR_FGD = 3    // GC_PR_BGD = 2    mMask.setTo(GC_BGD);    rect.x = max(0, rect.x);    rect.y = max(0, rect.y);    rect.width = min(rect.width, class="lazy" data-src.cols - rect.x);    rect.height = min(rect.height, class="lazy" data-src.rows - rect.y);    mMask(rect).setTo(Scalar(GC_PR_FGD));//将选中的区域设置为} void CrabCut_Matting::showImage(){    Mat result, binMask;    binMask.create(mMask.size(), CV_8UC1);    binMask = mMask & 1;    if (init) {        class="lazy" data-src.copyTo(result, binMask);    } else {        class="lazy" data-src.copyTo(result);    }    rectangle(result, rect, Scalar(0, 0, 255), 2, 8);    convert2Sence(result); }  void CrabCut_Matting::runGrabCut(){    if (rect.width < 2 || rect.height < 2) {        return;    }     if (init) {        grabCut(class="lazy" data-src, mMask, rect, bgModel, fgModel, 1);    } {        grabCut(class="lazy" data-src, mMask, rect, bgModel, fgModel, 1, GC_INIT_WITH_RECT);        init = true;    }}  void CrabCut_Matting::convert2Sence(Mat target){    scene.clear();    QImage image = ImageUtils::matToQImage(target);    QPixmap pixmap = QPixmap::fromImage(image);    QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap.scaled(this->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));    scene.addItem(item);}

感谢各位的阅读,以上就是“OpenCV中怎么使用GrabCut实现抠图功能”的内容了,经过本文的学习后,相信大家对OpenCV中怎么使用GrabCut实现抠图功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

OpenCV中怎么使用GrabCut实现抠图功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

OpenCV中怎么使用GrabCut实现抠图功能

这篇文章主要讲解了“OpenCV中怎么使用GrabCut实现抠图功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV中怎么使用GrabCut实现抠图功能”吧!1、概述grabCut
2023-07-05

OpenCV如何使用GrabCut实现抠图功能

这篇文章主要介绍“OpenCV如何使用GrabCut实现抠图功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“OpenCV如何使用GrabCut实现抠图功能”文章能帮助大家解决问题。1、概述案例:使
2023-07-05

C++ opencv如何利用grabCut算法实现抠图

今天小编给大家分享一下C++ opencv如何利用grabCut算法实现抠图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前
2023-06-30

如何使用python和opencv的mask实现抠图叠加

小编给大家分享一下如何使用python和opencv的mask实现抠图叠加,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的数据类型有哪些?python
2023-06-14

怎么使用Python+OpenCV实现图像识别替换功能

本文小编为大家详细介绍“怎么使用Python+OpenCV实现图像识别替换功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python+OpenCV实现图像识别替换功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
2023-07-02

html5如何利用canvas实现颜色容差抠图功能

这篇文章主要介绍了html5如何利用canvas实现颜色容差抠图功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。利用canvas的getImageData,我们可以获取到一
2023-06-09

怎么用QT+OpenCV实现录屏功能

这篇“怎么用QT+OpenCV实现录屏功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用QT+OpenCV实现录屏功能
2023-06-26

怎么用OpenCV绘制图形功能

这篇文章主要介绍“怎么用OpenCV绘制图形功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用OpenCV绘制图形功能”文章能帮助大家解决问题。1、绘制直线绘制直线函数是cv::line,函数
2023-06-26

使用opencv怎么实现一个车道线检测功能

这篇文章给大家介绍使用opencv怎么实现一个车道线检测功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。原理:算法基本思想说明:传统的车道线检测,多数是基于霍夫直线检测,其实这个里面有个很大的误区,霍夫直线拟合容易受
2023-06-06

vue项目中怎么使用canvas实现截图功能

本文小编为大家详细介绍“vue项目中怎么使用canvas实现截图功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中怎么使用canvas实现截图功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现效
2023-07-02

怎么在C++中使用opencv实现一个车道线识别功能

本篇文章为大家展示了怎么在C++中使用opencv实现一个车道线识别功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(一)目前国内外广泛使用的车道线检测方法主要分为两大类:(1) 基于道路特征的车
2023-06-06

怎么用C++ OpenCV实现文档矫正功能

这篇文章主要介绍了怎么用C++ OpenCV实现文档矫正功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C++ OpenCV实现文档矫正功能文章都会有所收获,下面我们一起来看看吧。需求将一个斜着拍摄的文
2023-06-29

OpenCV-Python怎么使用分水岭算法实现图像分割与提取功能

小编给大家分享一下OpenCV-Python怎么使用分水岭算法实现图像分割与提取功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!随着当今世界的发展,计算机视觉技
2023-06-15

使用canvas怎么实现一个拼图功能

使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后
2023-06-09

Android中怎么实现截图功能

Android中怎么实现截图功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 截图功能源码的分析一般没有修改rom的android原生系统截图功能的组合键是音量
2023-05-30

C++ OpenCV怎么实现形状识别功能

本篇内容主要讲解“C++ OpenCV怎么实现形状识别功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ OpenCV怎么实现形状识别功能”吧!一、图像预处理原图如图所示:首先第一步先进行
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录