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 相关文章推荐
wxPython框架类和面板类的使用实例
Sep 28 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
Python的Django REST框架中的序列化及请求和返回
Apr 11 Python
Python日期的加减等操作的示例
Aug 15 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
12个步骤教你理解Python装饰器
Jul 01 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
Python socket处理client连接过程解析
Mar 18 Python
python字典key不能是可以是啥类型
Aug 04 Python
python爬虫selenium模块详解
Mar 30 Python
python全面解析接口返回数据
Feb 12 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
JAVA/JSP学习系列之七
2006/10/09 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
php 数组的一个悲剧?
2011/05/11 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP连接access数据库
2015/03/27 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
php 实现进制相互转换
2016/04/07 PHP
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
JS出现失效的情况总结
2017/01/20 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
Python+PIL实现支付宝AR红包
2018/02/09 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
python 命令行传入参数实现解析
2019/08/30 Python
Python字符串格式化输出代码实例
2019/11/22 Python
python 贪心算法的实现
2020/09/18 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
海南地接欢迎词
2014/01/14 职场文书
捐款倡议书范文
2014/02/02 职场文书
北京青年观后感
2015/06/15 职场文书
周一给客户的问候语
2015/11/10 职场文书
分享Python获取本机IP地址的几种方法
2022/03/17 Python
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS