利用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 相关文章推荐
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
keras中的backend.clip用法
May 22 Python
python读取hdfs并返回dataframe教程
Jun 05 Python
使用sklearn对多分类的每个类别进行指标评价操作
Jun 11 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 Python
python​格式化字符串
Apr 20 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
基于empty函数的判断详解
2013/06/17 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
php构造函数与析构函数
2016/04/23 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
JavaScript 原型链学习总结
2010/10/29 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
django接入新浪微博OAuth的方法
2015/06/29 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
容易被忽略的Python内置类型
2020/09/03 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
怎样写好自我评价呢?
2014/02/16 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
酒店员工培训方案
2014/06/02 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
详解MySQL的半同步
2021/04/22 MySQL
Flink 侧流输出源码示例解析
2022/09/23 Servers