当前位置: 首页 > news >正文

opencv--GrabCut

GrabCut

-通过交互式的方式获得前景物体

GrabCut原理

  • 用户指定前景的大体区域,剩下的为背景区域
  • 用户还可以明确指定某些地方为前景或背景、
  • GrabCut采用分段迭代的方式分析前景物体形成模型树
  • 最后根据权重决定某个像素是前景还是背景

实战GrabCut

  • 主体结构
  • 鼠标事件的处理
  • 调用GrabCut实现前景与背景的分离

鼠标事件处理程序编写

import cv2 as cv
import numpy as np


class App:
    startX = 0
    startY = 0
    flag_rect = False
    def onmouse(self,event,x,y,flags,param):
        print('onmouse')
        if event == cv.EVENT_LBUTTONDOWN:
            self.startX = x
            self.startY = y
            self.flag_rect = True
            print("EVENT_LBUTTONDOWN")
        elif event == cv.EVENT_LBUTTONUP:
            self.flag_rect = False
            cv.rectangle(self.img, (self.startX, self.startY), (x, y), (0, 0, 255), 3)
            print('EVENT_LBUTTONUP')
        elif event == cv.EVENT_MOUSEMOVE:
            if self.flag_rect == True:
                self.img = self.img2.copy()
                cv.rectangle(self.img, (self.startX, self.startY), (x, y), (255, 0, 0), 3)
                print('EVENT_MOUSEMOVE')


    def run(self):
        cv.namedWindow('input')
        cv.setMouseCallback('input', self.onmouse)
        self.img = cv.imread('dog.jpeg')
        self.img2 = self.img.copy()
        while True:
            cv.imshow("input", self.img)
            k = cv.waitKey(100)
            if k == 27:
                break

if __name__ == '__main__':

    A = App()
    A.run()

GrabCut API

  • grabCut(img, mask, rect, bgdModel, fgdModel, 5, mode)
  • mask 生成的掩码
    • BGD: 背景,0
    • FGD:前景,1
    • PR_BGD:可能是背景,2
    • PR_FGD:可能是背景,3
  • Model
    • bgdModel,np.float64 type zero array of size (1,65).
    • fgdModel,同上
  • mode
    • GC_INT_WITH_RECT
    • GC_INT_WITH_MASK
import cv2 as cv
import numpy as np


class App:
    startX = 0
    startY = 0
    flag_rect = False
    rect = (0, 0, 0, 0)
    def onmouse(self,event,x,y,flags,param):
        print('onmouse')
        if event == cv.EVENT_LBUTTONDOWN:
            self.startX = x
            self.startY = y
            self.flag_rect = True
            print("EVENT_LBUTTONDOWN")
        elif event == cv.EVENT_LBUTTONUP:
            self.flag_rect = False
            cv.rectangle(self.img, (self.startX, self.startY), (x, y), (0, 0, 255), 3)
            self.rect = (min(self.startX, x), min(self.startY, y), self.startX-x, self.startY-y)
            print('EVENT_LBUTTONUP')
        elif event == cv.EVENT_MOUSEMOVE:
            if self.flag_rect == True:
                self.img = self.img2.copy()
                cv.rectangle(self.img, (self.startX, self.startY), (x, y), (255, 0, 0), 3)
                print('EVENT_MOUSEMOVE')


    def run(self):
        cv.namedWindow('input')
        cv.setMouseCallback('input', self.onmouse)
        self.img = cv.imread('luban1.png')
        self.img2 = self.img.copy()
        self.mask = np.zeros(self.img.shape[:2], dtype=np.uint8)
        self.output = np.zeros(self.img.shape, np.uint8)

        while True:
            cv.imshow("input", self.img)
            cv.imshow('output', self.output)
            k = cv.waitKey(100)
            if k == 27:
                break
            elif k == ord('g'):
                bgdModel = np.zeros((1, 65), np.float64)
                fgdModel = np.zeros((1, 65), np.float64)
                cv.grabCut(self.img2, self.mask, self.rect, bgdModel, fgdModel, 1, mode=cv.GC_INIT_WITH_RECT)
            mask2 = np.where((self.mask == 1)|(self.mask == 3), 255, 0).astype("uint8")
            self.output = cv.bitwise_and(self.img2, self.img2, mask=mask2)



if __name__ == '__main__':

    A = App()
    A.run()

相关文章:

  • IT计算机企业如何使用科技虚拟员工规避人工操作风险
  • 【Android】-- 数据存储(一)(共享参数SharePreferences、数据库SQLite)
  • 文件包含漏洞——实例
  • Nacos详解
  • 洛谷刷题(普及-):谁拿了最多奖学金、ISBN 号码、开心的金明、数列、多项式输出
  • SpringMVC(二)
  • 操作系统第九讲——线程的实现方式和多线程模型
  • 爬虫——第一次笔记 urllib的基本使用 urllib一个类型,六个方法 urllib下载 urllib请求对象的定制
  • 神经网络电子书,神经网络入门书
  • 面试说:聊聊JavaScript中的数据类型
  • 深入理解计算机系统——第三章 Machine-Level Representation of Programs
  • C# ZXing.net解码测试(QRCode、DataMatrix、1D-Barcode一维码条码)
  • 新手轻松日赚300+搬砖项目详解
  • 信号分析与处理——对于傅里叶信号一些整理
  • 2023陕西师范大学择校分析
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • CentOS 7 修改主机名
  • CSS3 变换
  • js 实现textarea输入字数提示
  • Js基础知识(四) - js运行原理与机制
  • LeetCode18.四数之和 JavaScript
  • maven工程打包jar以及java jar命令的classpath使用
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • node学习系列之简单文件上传
  • PHP那些事儿
  • python 学习笔记 - Queue Pipes,进程间通讯
  • uva 10370 Above Average
  • 鱼骨图 - 如何绘制?
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 转载:[译] 内容加速黑科技趣谈
  • Java数据解析之JSON
  • UI设计初学者应该如何入门?
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​Spring Boot 分片上传文件
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $.ajax中的eval及dataType
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (第二周)效能测试
  • (学习日记)2024.01.09
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ***通过什么方式***网吧
  • .gitignore
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .net专家(张羿专栏)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • /3GB和/USERVA开关
  • /bin/rm: 参数列表过长"的解决办法
  • @RequestMapping处理请求异常
  • @Resource和@Autowired的区别
  • [.net]官方水晶报表的使用以演示下载
  • [\u4e00-\u9fa5] //匹配中文字符
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [Angular] 笔记 18:Angular Router