服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ opencv利用grabCut算法实现抠图示例

C++ opencv利用grabCut算法实现抠图示例

2022-12-01 13:43浅念念52 C/C++

这篇文章主要为大家介绍了C++ opencv利用grabCut算法实现抠图的代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

grabCut算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只用少量的用户交互操作,即可得到比较好的分割结果,和分水岭顺丰比较相似,但是计算速度比较慢,得到的结果比较精确

用法:输入一幅图片并对一些像素做属于背景或属于前景的标记,算法会根据这个局部标记计算出整个图像中前景和背景的分割线。

一、grabCut函数

?
1
2
3
4
5
6
7
8
9
10
void grabCut(InputArray img, InputOutputArray mask, Rect rect,
        InputOutputArray bgdModel, InputOutputArray fgdModel,
        int iterCount, int mode = GC_EVAL);
    img 输入图像
    mask 输出掩码
    rect 用户选择的前景矩形区域
    bgdModel 输出背景图像
    fgdModel 输出前景图像
    iterCount 迭代次数
    mode 用于指示函数执行什么操作

二、compare函数

compare函数主要用于两个图像之间进行逐像素的比较

?
1
2
3
4
5
void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop);
    src1 原始图像1
    src2原始图像2
    dst 结果图像
    cmpop 操作类型

三、代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
    Mat img1;
    img1 = imread("test2.jpg");
    imshow("原图", img1);
    Rect rect(84, 84, 406, 318);
    Mat img2, bg, fg;
    grabCut(img1, img2, rect, bg, fg,1,GC_INIT_WITH_RECT);
    compare(img2, GC_PR_FGD, img2, CMP_EQ);
    imshow("img2", img2);
    Mat img3(img1.size(), CV_8UC3, Scalar(255, 255, 255));
    img1.copyTo(img3, img2);
    imshow("img3", img3);
    waitKey(0);
}

效果图:

C++ opencv利用grabCut算法实现抠图示例

以上就是C++ opencv利用grabCut算法实现抠图示例的详细内容,更多关于C++ opencv grabCut算法抠图的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/Lightismore/article/details/124054889

延伸 · 阅读

精彩推荐
  • C/C++C语言自增(++)和自减(--)实例详解

    C语言自增(++)和自减(--)实例详解

    本篇文章主要介绍了C语言的自增和自减的基本知识,并附有代码示例,以便大家理解,有需要的朋友可以看下...

    C语言教程网9512021-04-09
  • C/C++MFC创建右键弹出菜单的方法

    MFC创建右键弹出菜单的方法

    这篇文章主要介绍了MFC创建右键弹出菜单的方法,较为详细的分析了创建菜单资源及视类添加WM_RBUTTONDOWN消息的实现方法,是非常实用的技巧,具有一定参考借...

    C语言程序设计4552021-02-21
  • C/C++QT5编译使用QFtp的方法步骤

    QT5编译使用QFtp的方法步骤

    这篇文章主要介绍了QT5编译使用QFtp的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    zhoutk5122021-10-21
  • C/C++浅谈C++继承中的名字查找

    浅谈C++继承中的名字查找

    下面小编就为大家带来一篇浅谈C++继承中的名字查找。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网8502021-04-27
  • C/C++C语言冒泡排序算法实现代码

    C语言冒泡排序算法实现代码

    本文主要介绍C语言冒泡排序算法,这里给大家举例说明冒泡排序的思想,并附有代码示例,有需要的小伙伴可以参考下...

    C语言教程网5302021-04-09
  • C/C++C++实现修改函数代码HOOK的封装方法

    C++实现修改函数代码HOOK的封装方法

    这篇文章主要介绍了C++实现修改函数代码HOOK的封装方法,有助于深入了解C++的HOOK原理,需要的朋友可以参考下...

    C++教程网9792021-02-07
  • C/C++基于C程序启动代码的深入分析

    基于C程序启动代码的深入分析

    本篇文章是对C程序启动的代码进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网4722020-12-08
  • C/C++C++实现LeetCode(174.地牢游戏)

    C++实现LeetCode(174.地牢游戏)

    这篇文章主要介绍了C++实现LeetCode(174.地牢游戏),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang4242021-11-29