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中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
Python优先队列实现方法示例
Sep 21 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
Python内置模块turtle绘图详解
Dec 09 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
python支持多线程的爬虫实例
Dec 21 Python
Python 存取npy格式数据实例
Jul 01 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
Smarty保留变量用法分析
2016/05/23 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
JQuery小知识
2010/10/15 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
python中PIL安装简单教程
2016/04/21 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
妇产科护士自我鉴定
2013/10/15 职场文书
房地产项目策划书
2014/02/05 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
MySQL创建管理子分区
2022/04/13 MySQL
nginx访问报403错误的几种情况详解
2022/07/23 Servers