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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
requests和lxml实现爬虫的方法
Jun 11 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
利用python脚本如何简化jar操作命令
Feb 24 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
爬虫代理的cookie如何生成运行
Sep 22 Python
Python字典dict常用方法函数实例
Nov 09 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 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程序员的技术瓶颈分析
2011/07/17 PHP
深入理解PHP中的global
2014/08/19 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
新浪的图片新闻效果
2007/01/13 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
BootStrap中
2016/12/10 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
励志演讲稿范文
2014/04/29 职场文书
工商干部先进事迹
2014/05/14 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
如何在python中实现ECDSA你知道吗
2021/11/23 Python