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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
python读取html中指定元素生成excle文件示例
Apr 03 Python
Python日志模块logging简介
Apr 13 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
django主动抛出403异常的方法详解
Jan 04 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
python、Matlab求定积分的实现
Nov 20 Python
Python openpyxl模块原理及用法解析
Jan 19 Python
Python原始套接字编程实例解析
Jan 29 Python
pandas dataframe 中的explode函数用法详解
May 18 Python
python 模块重载的五种方法
Apr 24 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 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计算加权平均数的方法
2015/07/16 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
JS 继承实例分析
2008/11/04 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
Python自动连接ssh的方法
2015/03/07 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
python实现图片识别汽车功能
2018/11/30 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
写给媳妇的检讨书
2015/05/06 职场文书
活动简报范文
2015/07/22 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
如何在Python项目中引入日志
2021/05/31 Python
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js