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转码问题的解决方法
Oct 07 Python
python进阶教程之异常处理
Aug 30 Python
python实现带错误处理功能的远程文件读取方法
Apr 29 Python
详解Django中的过滤器
Jul 16 Python
Python 装饰器深入理解
Mar 16 Python
Django框架多表查询实例分析
Jul 04 Python
python获取地震信息 微信实时推送
Jun 18 Python
python安装gdal的两种方法
Oct 29 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
Python socket服务常用操作代码实例
Jun 22 Python
python爬取抖音视频的实例分析
Jan 19 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/04/18 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
vue v-model的用法解析
2020/10/19 Javascript
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
python调试神器PySnooper的使用
2019/07/03 Python
Django中的静态文件管理过程解析
2019/08/01 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
高中毕业的自我鉴定
2013/12/09 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
捐书仪式主持词
2015/07/04 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL