利用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调用C语言开发的共享库方法实例
Mar 18 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
python 写一个水果忍者游戏
Jan 13 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
ThinkPHP视图查询详解
2014/06/30 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
客户端静态页面玩分页
2006/06/26 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
jquery replace方法去空格
2017/05/08 jQuery
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
英国手机零售商:Metrofone
2019/03/18 全球购物
老师给学生的表扬信
2014/01/17 职场文书
政府法律服务方案
2014/06/14 职场文书
工作作风承诺书
2014/08/30 职场文书
比较node.js和Deno
2021/04/27 Javascript
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python