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中使用logging模块代替print(logging简明指南)
Jul 09 Python
python的即时标记项目练习笔记
Sep 18 Python
github配置使用指南
Nov 18 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
python实现身份证实名认证的方法实例
Nov 08 Python
基于python检查矩阵计算结果
May 21 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
next在python中返回迭代器的实例方法
Dec 15 Python
python如何调用php文件中的函数详解
Dec 29 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 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
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
python 产生token及token验证的方法
2018/12/26 Python
详解Python3中ceil()函数用法
2019/02/19 Python
python在不同条件下的输入与输出
2020/02/13 Python
Python: glob匹配文件的操作
2020/12/11 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
浅谈pytorch中的dropout的概率p
2021/05/27 Python