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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
快速解决安装python没有scripts文件夹的问题
Apr 03 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
pandas计算最大连续间隔的方法
Jul 04 Python
python实现单链表的方法示例
Sep 03 Python
python多线程扫描端口(线程池)
Sep 04 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 Python
python单元测试之pytest的使用
Jun 07 Python
Python作用域和名称空间的详细介绍
Apr 13 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和ACCESS写聊天室(五)
2006/10/09 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
jquery trim() 功能源代码
2011/02/14 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
django settings.py 配置文件及介绍
2019/07/15 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
安全检查验收制度
2014/01/12 职场文书
导游词之桂林
2019/08/20 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
话题作文之自信作文
2019/11/15 职场文书