# -*- 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, pointsMaxglobal lsPointsChoose, tpPointsChoose  # 存入选择的点global pointsCount  # 对鼠标按下的点计数global img2, ROI_bymouse_flagimg2 = 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 提取多边形ROItpPointsChoose.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 = 1lsPointsChoose = []cv2.imshow('src', img2)# -------------------------右键按下清除轨迹-----------------------------if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击print("right-mouse")pointsCount = 0tpPointsChoose = []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, mask2mask = 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相关推荐

  1. Win10+Python3+OpenCV+CUDA——在win中配置OpenCV4.5并与Python环境绑定

    Win10+Python3+OpenCV+CUDA--在win中配置OpenCV4.5并与Python环境绑定 前言 安装Anaconda和基本库 下载对应版本的CUDA 配置方案1.通过下载预购建文 ...

  2. 使用Python,OpenCV生成Aruco标记

    这篇博客将介绍Aruco标记是什么,以及如何使用Python,OpenCV生成Aruco标记.本文提供俩种生成方式:在线生成和代码生成: 使用OpenCV处理ArUco标签非常简单,因为OpenCV库 ...

  3. python3.9 执行python3.6生成的随机森林模型model.pkl报错,警告版本不一致

    python3.9 执行python3.6生成的随机森林模型model.pkl报错 UserWarning: Trying to unpickle estimator RandomForestClas ...

  4. OpenCV蒙版图像make mask image的实例(附完整代码)

    OpenCV蒙版图像make mask image的实例 OpenCV蒙版图像make mask image的实例 OpenCV蒙版图像make mask image的实例 #include &quo ...

  5. 计算机视觉之--使用opencv生成简笔画小视频

    本教程介绍了如何使用opencv生成一副简笔画视频,包括片头.如何做画等. 1.视频包括: (1)片头:包括学号姓名,同时会出现"I Love CV"在学号和姓名的中央,而且他们是 ...

  6. python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容

    python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容 1 pyzbar二维码检测模块 1.1. pyzbar模块介绍 1.2 pyzbar ...

  7. 关于如何在XP系统上运行opencv生成的C++动态库

    先讲下为什么要在xp系统上运行opencv生成的C++动态库,原因是我做了一个图像检测项目,使用C#编写的,C#里有个opencvsharp图像处理包,对于C#程序员调用在舒服不过了,但是!客户比较守 ...

  8. python3 opencv 视频格式转换

    python3 opencv 视频格式转换: import cv2 #获得视频的格式 videoCapture = cv2.VideoCapture('ad3.avi') #获得码率及尺寸 fps = ...

  9. allegro生成不规则钻孔

    http://blog.csdn.net/adrianfeng/article/details/5680093 之前画的板子上都有少许不规则过孔,给厂家制作时都会帮忙打上,所以没在意,这次换了个厂家, ...

最新文章

  1. 嵌入式开发之工具---比开发手册更重要的一个命令 man page
  2. WebSocket 原理
  3. Java springcloud B2B2C o2o多用户商城 springcloud架构 (十七)上传文件
  4. Android Gradle manifestPlaceholders 占位符详解
  5. 前台提交数据到php mysql,建立一个基础的MySQL数据库,使用PHP来抓取和处理数据,并抛出给前台...
  6. 线性动态电路的复频域分析
  7. 软件自动化测试题,软件自动化测试模拟题.doc
  8. Python和它高大上的插件们
  9. 仓位管理 – 2.实战篇
  10. C# list删除 另外list里面的元素_python学习笔记第三课:List(列表)
  11. nginx配置文件被删怎么找回_恢复误删除的Nginx日志
  12. 9.9 单片机蜂鸣器
  13. 2N个数排成一行(每个数有2个), 2个1之间有1个数,2个2 之间有2个数,...2个N之间有N个数... 例312132
  14. 【Oracle】并行等待之PX Deq: Table Q Normal
  15. 数钥科技遭用户投诉:“招集令”被指息费高,曾有助贷平台被处罚
  16. 非线性方程(组):高维方程解法
  17. Uniswap v3 详解(五):Oracle 预言机
  18. 雷迪9000使用说明_雷迪操作手册
  19. 易语言安卓模拟器adb模块制作认识adb
  20. PhpStorm修改字体和主题

热门文章

  1. vue如何输出一个值_怎么在控制台打印出来data里想要的数据? Vue
  2. emqx速度_EMQX-3.0性能测试报告-ReadtheDocs.PDF
  3. jar java classpath_win7中java编程工具安装 java环境变量设置
  4. PostgreSQL 消息平台实践
  5. 过滤驱动加密文件(代码)
  6. 黑客渗透入门教程 第一课:粗暴的端口扫描
  7. 通过 Mysql 官网配置更新本地的mysql源
  8. 【胡策08】解题报告
  9. VB6 实现命令行调用时附着到原控制台
  10. [AaronYang]C#人爱学不学8[事件和.net4.5的弱事件深入浅出]