欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python OpenCV GrabCut使用實例解析

 更新時間:2019年11月11日 10:16:48   作者:葉念西風  
這篇文章主要介紹了python OpenCV GrabCut使用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了python OpenCV GrabCut使用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

先上一個效果圖:

使用Python3.7+OpenCV 3.x.

需要引入 numpy庫。

在圖上用鼠標左鍵和右鍵標記前景和后景即可.

如果需要重新標記圖像,關閉程序重新運行.

以下是具體實現(xiàn)代碼

# -*- 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


# 鼠標的回調(diào)函數(shù)
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)
  # 左鍵釋放:結(jié)束畫圖
  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')
  # 定義鼠標的回調(diào)函數(shù)
  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] # 使用蒙板來獲取前景區(qū)域
      cv2.imshow('result', g_img.img_gc)

      print("Time used:", elapsed)

    # 按下ESC鍵退出
    if cv2.waitKey(20) == 27:
      break

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python計算時間間隔(精確到微妙)的代碼實例

    Python計算時間間隔(精確到微妙)的代碼實例

    今天小編就為大家分享一篇關于Python計算時間間隔(精確到微妙)的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • python?pygame實現(xiàn)打磚塊游戲

    python?pygame實現(xiàn)打磚塊游戲

    這篇文章主要為大家詳細介紹了python?pygame實現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python 用matplotlib畫以時間日期為x軸的圖像

    Python 用matplotlib畫以時間日期為x軸的圖像

    這篇文章主要介紹了Python 用matplotlib畫以時間日期為x軸的圖像,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 理解生產(chǎn)者消費者模型及在Python編程中的運用實例

    理解生產(chǎn)者消費者模型及在Python編程中的運用實例

    生產(chǎn)者消費者模型一般用于體現(xiàn)程序的多線程并發(fā)性,Python的多線程雖然受到GIL控制,但依然可以構(gòu)建隊列來簡單體現(xiàn)出模型的思路,這里我們就來共同理解生產(chǎn)者消費者模型及在Python編程中的運用實例:
    2016-06-06
  • Keras—embedding嵌入層的用法詳解

    Keras—embedding嵌入層的用法詳解

    這篇文章主要介紹了Keras—embedding嵌入層的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python中對list去重的多種方法

    python中對list去重的多種方法

    這篇文章主要介紹了python中對list去重的多種方法,本文去重的前提是要保證順序不變,本文給出了多種實現(xiàn)方法,需要的朋友可以參考下
    2014-09-09
  • Python Django中間件使用原理及流程分析

    Python Django中間件使用原理及流程分析

    這篇文章主要介紹了Python Django中間件使用原理及流程分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • python利用小波分析進行特征提取的實例

    python利用小波分析進行特征提取的實例

    今天小編就為大家分享一篇python利用小波分析進行特征提取的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python面向?qū)ο蟮娜筇匦苑庋b、繼承、多態(tài)

    Python面向?qū)ο蟮娜筇匦苑庋b、繼承、多態(tài)

    這篇文章介紹了Python面向?qū)ο蟮娜筇匦苑庋b、繼承、多態(tài),對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • python中實現(xiàn)json數(shù)據(jù)和類對象相互轉(zhuǎn)化的四種方式

    python中實現(xiàn)json數(shù)據(jù)和類對象相互轉(zhuǎn)化的四種方式

    在日常的軟件測試過程中,測試數(shù)據(jù)的構(gòu)造是一個占比非常大的活動,對于測試數(shù)據(jù)的構(gòu)造,分為結(jié)構(gòu)化的數(shù)據(jù)構(gòu)造方式和非結(jié)構(gòu)化的數(shù)據(jù)構(gòu)造方式,此篇文章,會通過4種方式來展示json數(shù)據(jù)與python的類對象相互轉(zhuǎn)化,需要的朋友可以參考下
    2024-07-07

最新評論