python OpenCV GrabCut使用实例解析


Posted in Python onNovember 11, 2019

这篇文章主要介绍了python OpenCV GrabCut使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

先上一个效果图:

python OpenCV GrabCut使用实例解析

使用Python3.7+OpenCV 3.x.

需要引入 numpy库。

在图上用鼠标左键和右键标记前景和后景即可.

如果需要重新标记图像,关闭程序重新运行.

以下是具体实现代码

# -*- coding:utf-8 -*-

'''
  Python: 3.5.7
  opencv 3.x

  在图上用鼠标左键和右键标记前景和后景即可.
  如果需要重新标记图像,关闭程序重新运行.
  By Ynxf http://www.zhouws.com
'''

import cv2
import numpy as np
import time

img_src = '../test_images/3.jpg'

drawing = False
mode = False

class GrabCut:
  def __init__(self, t_img):
    self.img = t_img
    self.img_raw = img.copy()
    self.img_width = img.shape[0]
    self.img_height = img.shape[1]
    self.scale_size = 640 * self.img_width // self.img_height
    if self.img_width > 640:
      self.img = cv2.resize(self.img, (640, self.scale_size), interpolation=cv2.INTER_AREA)
    self.img_show = self.img.copy()
    self.img_gc = self.img.copy()
    self.img_gc = cv2.GaussianBlur(self.img_gc, (3, 3), 0)
    self.lb_up = False
    self.rb_up = False
    self.lb_down = False
    self.rb_down = False
    self.mask = np.full(self.img.shape[:2], 2, dtype=np.uint8)
    self.firt_choose = True


# 鼠标的回调函数
def mouse_event2(event, x, y, flags, param):
  global drawing, last_point, start_point
  # 左键按下:开始画图
  if event == cv2.EVENT_LBUTTONDOWN:
    drawing = True
    last_point = (x, y)
    start_point = last_point
    param.lb_down = True
    print('mouse lb down')
  elif event == cv2.EVENT_RBUTTONDOWN:
    drawing = True
    last_point = (x, y)
    start_point = last_point
    param.rb_down = True
    print('mouse rb down')
  # 鼠标移动,画图
  elif event == cv2.EVENT_MOUSEMOVE:
    if drawing:
      if param.lb_down:
        cv2.line(param.img_show, last_point, (x,y), (0, 0, 255), 2, -1)
        cv2.rectangle(param.mask, last_point, (x, y), 1, -1, 4)
      else:
        cv2.line(param.img_show, last_point, (x, y), (255, 0, 0), 2, -1)
        cv2.rectangle(param.mask, last_point, (x, y), 0, -1, 4)
      last_point = (x, y)
  # 左键释放:结束画图
  elif event == cv2.EVENT_LBUTTONUP:
    drawing = False
    param.lb_up = True
    param.lb_down = False
    cv2.line(param.img_show, last_point, (x,y), (0, 0, 255), 2, -1)
    if param.firt_choose:
      param.firt_choose = False
    cv2.rectangle(param.mask, last_point, (x,y), 1, -1, 4)
    print('mouse lb up')
  elif event == cv2.EVENT_RBUTTONUP:
    drawing = False
    param.rb_up = True
    param.rb_down = False
    cv2.line(param.img_show, last_point, (x,y), (255, 0, 0), 2, -1)
    if param.firt_choose:
      param.firt_choose = False
      param.mask = np.full(param.img.shape[:2], 3, dtype=np.uint8)
    cv2.rectangle(param.mask, last_point, (x,y), 0, -1, 4)
    print('mouse rb up')

if __name__ == '__main__':
  img = cv2.imread(img_src)
  if img is None:
    print('error: 图像为空')
  g_img = GrabCut(img)

  cv2.namedWindow('image')
  # 定义鼠标的回调函数
  cv2.setMouseCallback('image', mouse_event2, g_img)
  while (True):
    cv2.imshow('image', g_img.img_show)
    if g_img.lb_up or g_img.rb_up:
      g_img.lb_up = False
      g_img.rb_up = False
      start = time.process_time()
      bgdModel = np.zeros((1, 65), np.float64)
      fgdModel = np.zeros((1, 65), np.float64)

      rect = (1, 1, g_img.img.shape[1], g_img.img.shape[0])
      print(g_img.mask)
      mask = g_img.mask
      g_img.img_gc = g_img.img.copy()
      cv2.grabCut(g_img.img_gc, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
      elapsed = (time.process_time() - start)
      mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8') # 0和2做背景
      g_img.img_gc = g_img.img_gc * mask2[:, :, np.newaxis] # 使用蒙板来获取前景区域
      cv2.imshow('result', g_img.img_gc)

      print("Time used:", elapsed)

    # 按下ESC键退出
    if cv2.waitKey(20) == 27:
      break

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的高级Git库 Gittle
Sep 22 Python
Python随机读取文件实现实例
May 25 Python
python将字典内容存入mysql实例代码
Jan 18 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
解决python3 安装不了PIL的问题
Aug 16 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
python openpyxl模块的使用详解
Feb 25 Python
Python上下文管理器用法及实例解析
Nov 11 #Python
Django 请求Request的具体使用方法
Nov 11 #Python
浅谈Python类中的self到底是干啥的
Nov 11 #Python
python 调试冷知识(小结)
Nov 11 #Python
通过 Django Pagination 实现简单分页功能
Nov 11 #Python
python机器学习实现决策树
Nov 11 #Python
Python SQLAlchemy入门教程(基本用法)
Nov 11 #Python
You might like
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
js css自定义分页效果
2017/02/24 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
jQuery实现滑动开关效果
2020/08/02 jQuery
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
天地会口号
2014/06/17 职场文书
买房协议书范本
2014/10/23 职场文书
音乐研修感悟
2015/11/18 职场文书
优质护理服务心得体会
2016/01/22 职场文书
学生安全责任协议书
2016/03/22 职场文书
手写实现JS中的new
2021/11/07 Javascript
java中如何截取字符串最后一位
2022/07/07 Java/Android