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

目录
  • 前言
  • 一、grabCut函数
  • 二、compare函数
  • 三、代码

前言

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

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

一、grabCut函数

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函数主要用于两个图像之间进行逐像素的比较

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

三、代码

#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算法抠图的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++使用OpenCV实现证件照蓝底换成白底功能(或其他颜色如红色)详解

    本文实例讲述了C++使用OpenCV实现证件照蓝底换成白底功能(或其他颜色如红色).分享给大家供大家参考,具体如下: 今天刚好老师要办点事情,老师唯一的一张证件照是蓝色的,但是需要的底色是白色的,于是乎,好久不折腾的PS也忘记了,还好旁边的刚来的小学弟懂一点, 在那里慢慢的帮老师一点点的处理,PS在边缘的地方效果还真不咋地,确实是一门技术活. 于是我就想OpenCV能不能实现呢?一搜百度第一篇就是,但是人家转成红色,然后我又对HSV颜色空间不是很懂,最后在一个学习群里 但是文中未对HSV那一块做

  • OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换

    目录 一.翻转(镜像) 二.仿射扭曲 获取变换矩阵 仿射扭曲函数 warpAffine 旋转 平移 三.仿射变换 四.透视变换 综合示例 总结 官网教程 一.翻转(镜像) 头文件 quick_opencv.h:声明类与公共函数 #pragma once #include <opencv2\opencv.hpp> using namespace cv; class QuickDemo { public: ... void flip_Demo(Mat& image); void rotat

  • C++中实现OpenCV图像分割与分水岭算法

    分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征. API介绍 void watershed( InputArray image, InputOutputArray markers ); 参数说明: image: 必须是一个8bit 3通道彩色图像矩阵序列 markers: 在执行分水岭函数watershed之前,必须对第二个参数markers

  • python OpenCV GrabCut使用实例解析

    这篇文章主要介绍了python OpenCV GrabCut使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先上一个效果图: 使用Python3.7+OpenCV 3.x. 需要引入 numpy库. 在图上用鼠标左键和右键标记前景和后景即可. 如果需要重新标记图像,关闭程序重新运行. 以下是具体实现代码 # -*- coding:utf-8 -*- ''' Python: 3.5.7 opencv 3.x 在图上用鼠标左键和右键标记

  • C++ OpenCV中几种基本的图像处理方式

    目录 一.图像显示 1.OpenCV的命名空间 2.Mat类简析 3.图像的载入:imread()函数 4.imshow()函数 二.图像腐蚀和膨胀 三.图像模糊 四.canny边缘检测 虽然单单要做车牌号识别的话不需要特别多种类的图像处理,但是我们不能只是为了这么一个目标去学习,所以这次就讲一些OpenCV里基本的图像处理,大家以后可以根据需求使用不同的图像处理. 一.图像显示 [打开Visual Studio]→[新建项目]→[Win32控制台应用项目(修改名称后点确定)]→[下一步]→[空

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

    目录 前言 一.grabCut函数 二.compare函数 三.代码 前言 grabCut算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只用少量的用户交互操作,即可得到比较好的分割结果,和分水岭顺丰比较相似,但是计算速度比较慢,得到的结果比较精确 用法:输入一幅图片并对一些像素做属于背景或属于前景的标记,算法会根据这个局部标记计算出整个图像中前景和背景的分割线. 一.grabCut函数 void grabCut(InputArray img, InputOutputArray mask,

  • OpenCV中Grabcut算法的具体使用

    目录 Grabcut 算法的基本步骤: Grabcut的相关API: Grabcut 算法的代码示例: Grabcut 算法主要运用于计算机视觉中的前背景分割,立体视觉和抠图等.该算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只要少量的用户交互操作即可得到比较好的分割结果. 1. Grabcut 的目标和背景的模型是RGB三通道的混合高斯模型GMM; 2. Grab Cut为一个不断进行分割估计和模型参数学习的交互迭代过程: 3. Grab Cut只需要提供背景区域的像素集就可以了.也就

  • Java OpenCV利用KNN算法实现图像背景移除

    目录 实现步骤 示例代码 结果图 实现步骤 1 获取视频 2 设置形态学结构 3 创建 Video.createBackgroundSubtractorKNN() 4 提取模型 BS 5 进行形态学变换 6 膨胀 7 二值化 8 展示结果 示例代码 package com.xu.opencv; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional

  • python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要更快速的算法.在06年有人提出了SURF算法"加速稳定特征",从名字上来看,他是SIFT算法的加速版本. (原文) 在SIFT算法当中使用高斯差分方程(Difference of Gaussian)对高斯拉普拉斯方程( Laplacian of Gaussian)进行近似.然而,SURF使

  • python opencv之SIFT算法示例

    本文介绍了python opencv之SIFT算法示例,分享给大家,具体如下: 目标: 学习SIFT算法的概念 学习在图像中查找SIFT关键的和描述符 原理: (原理部分自己找了不少文章,内容中有不少自己理解和整理的东西,为了方便快速理解内容和能够快速理解原理,本文尽量不使用数学公式,仅仅使用文字来描述.本文中有很多引用别人文章的内容,仅供个人记录使用,若有错误,请指正出来,万分感谢) 之前的harris算法和Shi-Tomasi 算法,由于算法原理所致,具有旋转不变性,在目标图片发生旋转时依然

  • Python 利用OpenCV给照片换底色的示例代码

    OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.相比于PIL库来说OpenCV更加强大, 可以做更多更复杂的应用,比如人脸识别等. 1. 读入并显示图片 im

  • python opencv之分水岭算法示例

    本文介绍了python opencv之分水岭算法示例,分享给大家,具体如下: 目标 使用分水岭算法对基于标记的图像进行分割 使用函数cv2.watershed() 原理: 灰度图像可以被看成拓扑平面,灰度值高的区域可以看出山峰,灰度值低的区域可以看成是山谷.向每一个山谷当中灌不同颜色的水.水位升高,不同山谷的水会汇合,为防止不同山谷的水汇合,小在汇合处建立起堤坝.然后继续灌水,然后再建立堤坝,直到山峰都掩模.构建好的堤坝就是图像的分割. 此方法通常会得到过渡分割的结果,因为图像中的噪声以及其他因

  • OpenCV使用GrabCut实现抠图功能

    目录 1.概述 2.代码示例 3.示例图片 1.概述 案例:使用OpenCV的GrapCut实现有用户交互的抠图 grabCut( InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode = GC_EVAL ); img --> 输入的三通道图像: mask --> 输入的单通道图像,初始化方式为

  • android广角相机畸变校正算法和实现示例

    1.光学相机镜头一般都存在畸变的问题,畸变属于成像的几何失真,它是由于焦平面上不同区域对影像的放大率不同而形成的画面扭曲变形现象.除了一些特定的场合,大部分情况下,这些失真都是需要校正到正常人眼不产生扭曲的程度. 2常见的畸变是枕形畸变,桶形畸变和线性畸变.广角镜头的摄像设备拍摄出来的图像经常会有桶形畸变的问题.原因在于广角镜头使用的是凸透镜,初中物理知识告诉我们凸透镜会对光线起汇聚作用,这是光的折射造成的.而离镜头中心越远,折射效果越强,因而其拍出来的照片会以镜头中心为圆心,呈圆形向外扩展失真

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

随机推荐