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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
对Python新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
python字典get()方法用法分析
Apr 17 Python
在Python中使用列表生成式的教程
Apr 27 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
tensorflow实现softma识别MNIST
Mar 12 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
Python 变量的创建过程详解
Sep 02 Python
python实点云分割k-means(sklearn)详解
May 28 Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 Python
python装饰器代码解析
Mar 23 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
bootstrap weebox 支持ajax的模态弹出框
2017/02/23 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
Python变量和字符串详解
2017/04/29 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
上海中网科技笔试题
2012/02/19 面试题
饲料采购员岗位职责
2013/12/19 职场文书
初中学生评语大全
2014/04/24 职场文书
大学辅导员述职报告
2015/01/10 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
详解Vue的列表渲染
2021/11/20 Vue.js