文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 04:08

关注

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

1、概述

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

grabCut( InputArray img, InputOutputArray mask, Rect rect,                           InputOutputArray bgdModel, InputOutputArray fgdModel,                           int iterCount, int mode = GC_EVAL );

实现算法的步骤:

创建一个遮罩,并初始化为背景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实现抠图功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯