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 自动安装 Rising 杀毒软件
Apr 24 Python
Python实现全角半角字符互转的方法
Nov 28 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
Python最小二乘法矩阵
Jan 02 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
浅谈keras2 predict和fit_generator的坑
Jun 17 Python
Python更改pip镜像源的方法示例
Dec 01 Python
Python 多线程处理任务实例
Nov 07 Python
Python中的datetime包与time包包和模块详情
Feb 28 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 01 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
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php获取随机数组列表的方法
2014/11/13 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
javascript this用法小结
2008/12/19 Javascript
javascript 函数速查表
2010/02/07 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
2014年秘书工作总结
2014/11/25 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
2019同学聚会主持词
2019/05/06 职场文书
导游词之吉林花园山
2019/10/17 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL
使用Django实现商城验证码模块的方法
2021/06/01 Python