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+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
Django框架封装外部函数示例
May 28 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
Jan 18 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
python中count函数知识点浅析
Dec 17 Python
python中温度单位转换的实例方法
Dec 27 Python
python re模块和正则表达式
Mar 24 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
解决numpy和torch数据类型转化的问题
May 23 Python
python绘制云雨图raincloud plot
Aug 05 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+mysql写的留言本
2006/10/09 PHP
php笔记之常用文件操作
2010/10/12 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
chrome原生方法之数组
2011/11/30 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
Vue自定义指令详解
2017/07/28 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
python实现中文分词FMM算法实例
2015/07/10 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
银行服务感言
2014/03/01 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
陈欧广告词
2014/03/14 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
开业庆典主持词
2014/03/21 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
2014年人事部工作总结
2014/12/03 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
优秀大学生自荐信
2015/03/26 职场文书
Nginx快速入门教程
2021/03/31 Servers
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript