在Python中使用鼠标单击获取图像的像素坐标

在Python中使用鼠标单击获取图像的像素坐标,python,mouseclick-event,Python,Mouseclick Event,我确信这将是一项简单的任务,但在两天的搜索和实现中,我无法解决它 目标很简单:我想从2D图像中提取像素坐标,用鼠标点击,然后,我想用这些坐标进行不同的计算 我发现不同的实现使用不同的库,更有趣的解决方案如下: import matplotlib.pyplot as plt import numpy as np fig = plt.figure() def onclick(event): print('you pressed', event.key, event.xdata, event

我确信这将是一项简单的任务,但在两天的搜索和实现中,我无法解决它

目标很简单:我想从2D图像中提取像素坐标,用鼠标点击,然后,我想用这些坐标进行不同的计算

我发现不同的实现使用不同的库,更有趣的解决方案如下:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
def onclick(event):
    print('you pressed', event.key, event.xdata, event.ydata)
    X_coordinate = event.xdata
    Y_coordinate = event.ydata

cid = fig.canvas.mpl_connect('button_press_event', onclick)
lines, = plt.plot([1,2,3])
plt.show()
现在我的问题是找出这两个变量(X_坐标和Y_坐标),并将它们用于其他用途

我尝试了从此处复制的以下解决方案()来尝试提取X_坐标,但它不起作用:

import matplotlib.pyplot as plt
import numpy as np
mutable_object = {} 
fig = plt.figure()
def onclick(event):
    print('you pressed', event.key, event.xdata, event.ydata)
    X_coordinate = event.xdata
    Y_coordinate = event.ydata
    mutable_object['click'] = X_coordinate

cid = fig.canvas.mpl_connect('button_press_event', onclick)
lines, = plt.plot([1,2,3])
X_coordinate = mutable_object['key']
plt.show()

非常感谢您的帮助

我认为问题可能是在函数定义中使用可变_对象['click'],在函数外部使用可变_对象['key']。键“key”不在dictionary可变_对象中

import matplotlib.pyplot as plt
import numpy as np
mutable_object = {} 
fig = plt.figure()
def onclick(event):
    print('you pressed', event.key, event.xdata, event.ydata)
    X_coordinate = event.xdata
    Y_coordinate = event.ydata
    mutable_object['click'] = X_coordinate

cid = fig.canvas.mpl_connect('button_press_event', onclick)
lines, = plt.plot([1,2,3])
plt.show()
X_coordinate = mutable_object['click']
print(X_coordinate)
下面粘贴的示例来自matplotlib文档,从长远来看可能是更好的方法。基本思想是创建一个对象,将单击位置存储在属性中。单击完成后,可以调用此属性

from matplotlib import pyplot as plt

class LineBuilder:
    def __init__(self, line):
        self.line = line
        self.xs = list(line.get_xdata())
        self.ys = list(line.get_ydata())
        self.cid = line.figure.canvas.mpl_connect('button_press_event', self)

    def __call__(self, event):
        print('click', event)
        if event.inaxes!=self.line.axes: return
        self.xs.append(event.xdata)
        self.ys.append(event.ydata)
        self.line.set_data(self.xs, self.ys)
        self.line.figure.canvas.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to build line segments')
line, = ax.plot([0], [0])  # empty line
linebuilder = LineBuilder(line)

plt.show()