python3+opencv生成不规则黑白mask实例


Posted in Python onFebruary 19, 2020

废话不多说,直接上代码吧!

# -*- coding: utf-8 -*-
import cv2
import numpy as np
 
# -----------------------鼠标操作相关------------------------------------------
lsPointsChoose = []
tpPointsChoose = []
pointsCount = 0
count = 0
pointsMax = 10
def on_mouse(event, x, y, flags, param):
 global img, point1, point2, count, pointsMax
 global lsPointsChoose, tpPointsChoose # 存入选择的点
 global pointsCount # 对鼠标按下的点计数
 global img2, ROI_bymouse_flag
 img2 = img.copy() # 此行代码保证每次都重新再原图画 避免画多了
 
 # -----------------------------------------------------------
 # count=count+1
 # print("callback_count",count)
 # --------------------------------------------------------------
 
 if event == cv2.EVENT_LBUTTONDOWN: # 左键点击
  pointsCount = pointsCount + 1
  # 感觉这里没有用?2018年8月25日20:06:42
  # 为了保存绘制的区域,画的点稍晚清零
  # if (pointsCount == pointsMax + 1):
  #  pointsCount = 0
  #  tpPointsChoose = []
  print('pointsCount:', pointsCount)
  point1 = (x, y)
  print (x, y)
  # 画出点击的点
  cv2.circle(img2, point1, 10, (0, 255, 0), 2)
 
  # 将选取的点保存到list列表里
  lsPointsChoose.append([x, y]) # 用于转化为darry 提取多边形ROI
  tpPointsChoose.append((x, y)) # 用于画点
  # ----------------------------------------------------------------------
  # 将鼠标选的点用直线连起来
  print(len(tpPointsChoose))
  for i in range(len(tpPointsChoose) - 1):
   print('i', i)
   cv2.line(img2, tpPointsChoose[i], tpPointsChoose[i + 1], (0, 0, 255), 2)
  # ----------------------------------------------------------------------
  # ----------点击到pointMax时可以提取去绘图----------------
  if (pointsCount == pointsMax):
   # -----------绘制感兴趣区域-----------
   ROI_byMouse()
   ROI_bymouse_flag = 1
   lsPointsChoose = []
 
  cv2.imshow('src', img2)
 # -------------------------右键按下清除轨迹-----------------------------
 if event == cv2.EVENT_RBUTTONDOWN: # 右键点击
  print("right-mouse")
  pointsCount = 0
  tpPointsChoose = []
  lsPointsChoose = []
  print(len(tpPointsChoose))
  for i in range(len(tpPointsChoose) - 1):
   print('i', i)
   cv2.line(img2, tpPointsChoose[i], tpPointsChoose[i + 1], (0, 0, 255), 2)
  cv2.imshow('src', img2)
 
def ROI_byMouse():
 global src, ROI, ROI_flag, mask2
 mask = np.zeros(img.shape, np.uint8)
 pts = np.array([lsPointsChoose], np.int32) # pts是多边形的顶点列表(顶点集)
 pts = pts.reshape((-1, 1, 2))
 # 这里 reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。
 # OpenCV中需要先将多边形的顶点坐标变成顶点数×1×2维的矩阵,再来绘制
 
 # --------------画多边形---------------------
 mask = cv2.polylines(mask, [pts], True, (255, 255, 255))
 ##-------------填充多边形---------------------
 mask2 = cv2.fillPoly(mask, [pts], (255, 255, 255))
 cv2.imshow('mask', mask2)
 cv2.imwrite('mask.jpg', mask2)
 ROI = cv2.bitwise_and(mask2, img)
 #cv2.imwrite('ROI.bmp', ROI)
 #cv2.imshow('ROI', ROI)
 
 
# -----------------------定点ROI绘制,程序中未使用-------------------
def fixed_ROI():
 mask = np.zeros(img.shape, np.uint8)
 pts = np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]], np.int32) # 顶点集
 pts = pts.reshape((-1, 1, 2))
 mask = cv2.polylines(mask, [pts], True, (255, 255, 255))
 mask2 = cv2.fillPoly(mask, [pts], (255, 255, 255))
 cv2.imshow('mask', mask2)
 # cv2.imwrite('mask.bmp', mask2)
 # cv2.drawContours(mask,points,-1,(255,255,255),-1)
 ROI = cv2.bitwise_and(mask2, img)
 cv2.imshow('ROI', ROI)
 # cv2.imwrite('ROI.bmp', ROI)
 
 
img = cv2.imread('yuantu.jpg')
# ---------------------------------------------------------
# --图像预处理,设置其大小
# height, width = img.shape[:2]
# size = (int(width * 0.3), int(height * 0.3))
# img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
# ------------------------------------------------------------
ROI = img.copy()
cv2.namedWindow('src')
cv2.setMouseCallback('src', on_mouse)
cv2.imshow('src', img)
cv2.waitKey(0)

python3+opencv生成不规则黑白mask实例

以上这篇python3+opencv生成不规则黑白mask实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
python xpath获取页面注释的方法
Jan 14 Python
Python实现计算对象的内存大小示例
Jul 10 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
基于python3的socket聊天编程
Feb 17 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
python 安装移动复制第三方库操作
Jul 13 Python
Python爬虫后获取重定向url的两种方法
Jan 19 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
使用celery和Django处理异步任务的流程分析
Feb 19 #Python
Python Numpy,mask图像的生成详解
Feb 19 #Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 #Python
Python中logging日志库实例详解
Feb 19 #Python
在Python中通过threshold创建mask方式
Feb 19 #Python
python实现简单颜色识别程序
Feb 19 #Python
python绘制封闭多边形教程
Feb 18 #Python
You might like
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
jquery登录的异步验证操作示例
2019/05/09 jQuery
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
在Python的Django框架中编写编译函数
2015/07/20 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
Python列表list排列组合操作示例
2018/12/18 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
python plotly绘制直方图实例详解
2019/07/22 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
文员个人求职自荐信
2013/09/21 职场文书
大学生个人自我鉴定
2013/12/03 职场文书
班组长岗位职责
2014/03/03 职场文书
寄语是什么意思
2014/04/10 职场文书
家庭教育的心得体会
2014/09/01 职场文书
个人债务授权委托书范本
2014/10/05 职场文书