利用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实现一个简单的能够上传下载的HTTP服务器
May 05 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Python金融数据可视化汇总
Nov 17 Python
Django中url的反向查询的方法
Mar 14 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 Python
详解java调用python的几种用法(看这篇就够了)
Dec 10 Python
用python读取xlsx文件
Dec 17 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
Python之多进程与多线程的使用
Feb 23 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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 获得汉字拼音首字母的函数
2009/08/01 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
js计算德州扑克牌面值的方法
2015/03/04 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
python之PyMongo使用总结
2017/05/26 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
python 如何引入协程和原理分析
2020/11/30 Python
使用python实现学生信息管理系统
2021/02/25 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
HTML5的语法变化介绍
2013/08/13 HTML / CSS
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
酒吧创业计划书
2014/01/18 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
财产公证书样本
2014/04/04 职场文书
商场父亲节活动方案
2014/08/27 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
Python+Tkinter制作专属图形化界面
2022/04/01 Python