利用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代码
Mar 13 Python
Python用GET方法上传文件
Mar 10 Python
python使用cStringIO实现临时内存文件访问的方法
Mar 26 Python
Django中Model的使用方法教程
Mar 07 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
python requests.post带head和body的实例
Jan 02 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
python 中如何获取列表的索引
Jul 02 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
Python上下文管理器全实例详解
Nov 12 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 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生成静态页的实现方法
2013/05/10 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
python解析xml模块封装代码
2014/02/07 Python
Python基本数据类型详细介绍
2014/03/11 Python
浅谈Python的文件类型
2016/05/30 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
Foreo国际站:Foreo International
2018/10/29 全球购物
船舶专业个人求职信范文
2014/01/02 职场文书
新闻发布会主持词
2014/03/28 职场文书
项目投资建议书
2014/05/16 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
python文件目录操作之os模块
2021/05/08 Python
Python爬虫基础初探selenium
2021/05/31 Python
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技