利用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抓取淘宝下拉框关键词的方法
Jul 08 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
python中嵌套函数的实操步骤
Feb 27 Python
详解Python 解压缩文件
Apr 09 Python
Python单元和文档测试实例详解
Apr 11 Python
利用rest framework搭建Django API过程解析
Aug 31 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
Python通过文本和图片生成词云图
May 21 Python
python判断元素是否存在的实例方法
Sep 24 Python
PyTorch中clone()、detach()及相关扩展详解
Dec 09 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 判断网页是否是utf8编码的方法
2014/06/06 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
Javascript执行效率全面总结
2013/11/04 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
原生js实现随机点名
2020/07/05 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
python爬虫之百度API调用方法
2017/06/11 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
浅谈Django的缓存机制
2018/08/23 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
房地产销售大学生自我评价分享
2013/11/11 职场文书
材料物理专业个人求职信
2013/12/15 职场文书
2014植树节活动总结
2014/03/11 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
2015年护士节活动总结
2015/02/10 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
学术研讨会主持词
2015/07/04 职场文书
三好学生竞选稿
2015/11/21 职场文书