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多线程编程中的join函数使用心得
Sep 02 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
Python 自动化表单提交实例代码
Jun 08 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
python中metaclass原理与用法详解
Jun 25 Python
python实现串口自动触发工作的示例
Jul 02 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
Python如何telnet到网络设备
Feb 18 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
js变量提升深入理解
2016/09/16 Javascript
详解ES6中的let命令
2020/04/05 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
成人大专生实习期的自我评价
2013/10/02 职场文书
市场总经理岗位职责
2014/04/11 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
高中校园广播稿
2014/10/21 职场文书
检讨书怎么写
2015/01/23 职场文书
药店收银员岗位职责
2015/04/07 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS