利用matplotlib为图片上添加触发事件进行交互


Posted in Python onApril 23, 2020

这篇文章的目的出于实验的需要,我需要对图片上的部分区域做出涂抹标记,本来是选择用opencv做交互的,但在需要进行图像的输出以及鼠标时间添加时,opencv出现错误。

解决方案网上有很多,尝试以后依然bug,这里先做一个记录,有时间再来处理。

错误报告如下:

OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvShowImage, file -------src-dir-------/opencv-2.4.10/modules/highgui/src/window.cpp, line 501
Traceback (most recent call last):
File "test.py", line 20, in <module>
cv2.imshow('img',img)
cv2.error: -------src-dir-------/opencv-2.4.10/modules/highgui/src/window.cpp:501: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvShowImage

这里我们切换另一种解决方案,利用python的matplotlib库完成图像的输出以及鼠标事件的添加。

点击图片,在图像中鼠标对应位置画点:

# coding=utf-8
from matplotlib import pyplot as plt
import cv2

def on_press(event):
 if event.inaxes == None:
  print "none"
  return 
 #在鼠标的当前位置绘制一个点
 ax.scatter(event.xdata, event.ydata)
 #更新画板
 fig.canvas.draw()

if __name__ == "__main__":
 fileN = r'./0107_1.3.6.1.4.1.14519.5.2.1.6279.6001.263660956768649083933159084365.bmp'
 img = cv2.imread(fileN)
 cv2.imshow('img',img)
 fig = py.figure()
 fig.canvas.mpl_connect("button_press_event", on_press) 
 ax = fig.add_subplot(121)
 ax1 = fig.add_subplot(122)
 ax.imshow(img)
 ax1.imshow(img)
 plt.axis("off")
 plt.show()

先来简单解释一下代码的含义:

fig.canvas.mpl_connect("button_press_event", on_press)#在这个figure上加点击事件,点击后的情况在自己写的on_press()方法里 
def on_press(event): 
  event.inaxes.figure.canvas.draw()#用于图片刷新 
  event.x#事件的坐标用于其他按钮点击和figure点击发生冲突时判断返回 
  event.xdata,event.ydata#鼠标点击的位置,与上面那个坐标表示形式不同

最后的输出结果入下图。我们得到了非常奇怪的结果,如果你自己亲自动手试的话体会应该会更有体会,两边的图像本来应该一样大,但在第一次绘制点的时候,左侧图像出现了闪动,然后尺寸的比例突然发生了变化。

利用matplotlib为图片上添加触发事件进行交互

是的,图像尺寸没有发生变化,但尺寸的比例的确变了,这里我们要做的就是关闭自动变化的尺度比例。

if __name__ == "__main__":
 fileN = r'./0107_1.3.6.1.4.1.14519.5.2.1.6279.6001.263660956768649083933159084365.bmp'
 img = cv2.imread(fileN)
 cv2.imshow('img',img)
 fig = py.figure()
 fig.canvas.mpl_connect("button_press_event", on_press) 
 ax = fig.add_subplot(121)
 ax1 = fig.add_subplot(122)
 ax.imshow(img)
 ax1.imshow(img)
 #关闭自动尺度适配
 ax.set_autoscale_on(False) 
 plt.axis("off")
 plt.show()

当然,我们可以改变绘制标记的样式:

ax.scatter(x,y,c='k',s=25,alpha=1.0,marker='o')
#T:散点的颜色
#s:散点的大小
#alpha:是透明程度

现在我们能够在图像上进行标记了,但这样还不够,程序需要获取这些标记点。

实际上fig.canvas.mpl_connect("button_press_event", on_press)能够进行自定义的多参数传递,如果在每次绘制的时候将数据保存在外部传入的列表中,那么当画板被销毁时,我们就能获取到原来所有的绘制点。

这里介绍两种使用方法:

def on_key(event, arg1, arg2, arg3):
 pass
canvas.mpl_connect('key_press_event', lambda event: on_key(event, plt1, plt2, plt3))

def on_key(event, args_list):
 pass
fig.canvas.mpl_connect('key_press_event', lambda event: on_key(event, [plt1, plt2, plt3]))

这里需要注意的是scatter绘制的点,实际上并没有大小的概念,这个点实质是一个坐标。

如果需要绘制有实际面积的圆形的标记,可以使用matplotlib.patches.Circle

具体的使用如下:

from matplotlib.patches import Circle

fig = plt.figure()
ax = fig.add_subplot(111)
cir = Circle(xy = (event.xdata, event.ydata),facecolor = 'black', edgecolor='black',radius=10, alpha=1.0) 
ax.add_patch(cir)

以上这篇利用matplotlib为图片上添加触发事件进行交互就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python深入学习之内存管理
Aug 31 Python
跟老齐学Python之永远强大的函数
Sep 14 Python
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
Python中处理字符串之islower()方法的使用简介
May 19 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
python学生信息管理系统
Mar 13 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
python_array[0][0]与array[0,0]的区别详解
Feb 18 Python
python实现简单井字棋游戏
Mar 04 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 #Python
使用matplotlib动态刷新指定曲线实例
Apr 23 #Python
Flask模板引擎Jinja2使用实例
Apr 23 #Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 #Python
在matplotlib中改变figure的布局和大小实例
Apr 23 #Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 #Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 #Python
You might like
用php来检测proxy
2006/10/09 PHP
php下网站防IP攻击代码,超级实用
2010/10/24 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
js防抖和节流的深入讲解
2018/12/06 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
python 正则表达式 概述及常用字符
2009/05/04 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
python判断windows系统是32位还是64位的方法
2015/05/11 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
python tkinter组件使用详解
2019/09/16 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
带薪年假请假条
2014/02/04 职场文书
优秀护士先进事迹
2014/05/08 职场文书
承诺书格式
2014/06/03 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
golang中的空接口使用详解
2021/03/30 Python
详解OpenCV曝光融合
2022/04/29 Python