利用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实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
python正则中最短匹配实现代码
Jan 16 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
django解决跨域请求的问题详解
Jan 20 Python
在Python 的线程中运行协程的方法
Feb 24 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
Django admin 实现search_fields精确查询实例
Mar 30 Python
Django静态资源部署404问题解决方案
May 11 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
python合并多个excel文件的示例
Sep 23 Python
Python return语句如何实现结果返回调用
Oct 15 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
php 字符串函数收集
2010/03/29 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
javascript 对象定义方法 简单易学
2009/03/22 Javascript
js select常用操作控制代码
2010/03/16 Javascript
js单词形式的运算符
2014/05/06 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
python pdb调试方法分享
2014/01/21 Python
Python解析最简单的验证码
2016/01/07 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
销售文员岗位职责
2013/11/29 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
Python面向对象之内置函数相关知识总结
2021/06/24 Python