返回顶部
首页 > 资讯 > 精选 >OpenCV如何使用GrabCut实现抠图功能
  • 135
分享到

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

2023-07-05 04:07:28 135人浏览 泡泡鱼
摘要

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

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

1、概述

案例:使用OpenCV的GrapCut实现有用户交互的抠图

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){    src = imread(filePath);    if(src.empty()){        qDebug()<<"输入图像为空";        return;    }     //创建一个背景遮罩    mMask = Mat::zeros(src.size(),CV_8UC1);    mMask.setTo(Scalar::all(GC_BGD));      convert2Sence(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, src.cols - rect.x);    rect.height = min(rect.height, 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) {        src.copyTo(result, binMask);    } else {        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(src, mMask, rect, bgModel, fgModel, 1);    } {        grabCut(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实现抠图功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: OpenCV如何使用GrabCut实现抠图功能

本文链接: https://lsjlt.com/news/349329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • OpenCV如何使用GrabCut实现抠图功能
    这篇文章主要介绍“OpenCV如何使用GrabCut实现抠图功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“OpenCV如何使用GrabCut实现抠图功能”文章能帮助大家解决问题。1、概述案例:使...
    99+
    2023-07-05
  • OpenCV中怎么使用GrabCut实现抠图功能
    这篇文章主要讲解了“OpenCV中怎么使用GrabCut实现抠图功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV中怎么使用GrabCut实现抠图功能”吧!1、概述grabCut...
    99+
    2023-07-05
  • C++ opencv如何利用grabCut算法实现抠图
    今天小编给大家分享一下C++ opencv如何利用grabCut算法实现抠图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-30
  • C++ opencv利用grabCut算法实现抠图示例
    目录前言一、grabCut函数二、compare函数三、代码前言 grabCut算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只用少量的用户交互操作,即可得到比较好的分割结果...
    99+
    2024-04-02
  • 如何使用python和opencv的mask实现抠图叠加
    小编给大家分享一下如何使用python和opencv的mask实现抠图叠加,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的数据类型有哪些python的...
    99+
    2023-06-14
  • Python抠图:使用OpenCV实现背景去除
    一、了解抠图和OpenCV库 抠图(Matting)是图像处理领域的重要任务之一,旨在将对象与其它部分分离。OpenCV是一个开源计算机视觉库,它提供了丰富的函数和工具进行图像编辑处理,可以简单而快速地实现抠图功能,同时可以进行更多的图像处...
    99+
    2023-09-28
    python opencv 开发语言
  • 使用python和opencv的mask实现抠图叠加
    背景照片: logo: 合成效果: 代码: import cv2 as cv, numpy as np # Load two images img1 = cv.imread...
    99+
    2024-04-02
  • html5如何利用canvas实现颜色容差抠图功能
    这篇文章主要介绍了html5如何利用canvas实现颜色容差抠图功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。利用canvas的getImageData,我们可以获取到一...
    99+
    2023-06-09
  • OpenCv实现绘图功能
    本文实例为大家分享了OpenCv实现绘图功能的具体代码,供大家参考,具体内容如下 绘制一个图像在上面画线: import numpy as np import matplotli...
    99+
    2024-04-02
  • C++ OpenCV如何实现图像修复功能
    本篇文章给大家分享的是有关C++ OpenCV如何实现图像修复功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言下面将使用OpenCV C++ 对有瑕疵的图像进行...
    99+
    2023-06-26
  • Python用20行代码实现批量抠图功能
    目录前言1.准备2.编写代码3.结果分析前言 抠图前 vs Python自动抠图后 在日常的工作和生活中,我们经常会遇到需要抠图的场景,即便是只有一张图片需要抠,也会抠得我们不耐...
    99+
    2024-04-02
  • Python实现一键抠图功能的全过程
    本篇内容主要讲解“Python实现一键抠图功能的全过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python实现一键抠图功能的全过程”吧!简介使用百度深度学习框架paddlepaddle对人...
    99+
    2023-06-20
  • 如何用Java+OpenCV实现拍照功能
    本篇内容主要讲解“如何用Java+OpenCV实现拍照功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用Java+OpenCV实现拍照功能”吧!依赖jar包:只有一个OpenCv的jar包...
    99+
    2023-06-26
  • 如何使用HTML实现截图功能
    这篇文章主要介绍了如何使用HTML实现截图功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言最近项目需求总是有HTML页面生成图片功能,...
    99+
    2024-04-02
  • C++OpenCV实现图像修复功能
    目录前言一、OpenCV inpaint二、源码三、效果显示前言 本文将使用OpenCV C++ 对有瑕疵的图像进行修复。OpenCV 提供了inpaint API可进行图像修复。 ...
    99+
    2024-04-02
  • Python快速实现一键抠图功能的全过程
    简介 使用百度深度学习框架paddlepaddle对人像图片进行自动化抠图 安装 根据PaddlePaddle官网命令安装 如 pip install paddlepaddle...
    99+
    2024-04-02
  • 如何使用OpenCV实现图像增强
    本篇内容介绍了“如何使用OpenCV实现图像增强”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本期将介绍如何通过图像处理从低分辨率/模糊/低...
    99+
    2023-06-20
  • 怎么使用Python+OpenCV实现图像识别替换功能
    本文小编为大家详细介绍“怎么使用Python+OpenCV实现图像识别替换功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python+OpenCV实现图像识别替换功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
  • OpenCV实现更改图片颜色功能
    原图效果: 更改颜色后效果: 直接上源码: #include <opencv2/opencv.hpp> #include <iostream> #incl...
    99+
    2024-04-02
  • C++OpenCV实现图像去水印功能
    目录前言一、水印定位二、图像修复三、效果显示四、源码总结前言 本文将使用OpenCV C++ 进行简单图像水印去除。我们在网上download图片时,经常因为版权问题有水印。本案例通...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作