Получение пиксельной координаты изображения, щелкающего мышью в Python - PullRequest
0 голосов
/ 13 февраля 2019

Я был уверен, что это будет простая задача, но за два дня поисков и реализаций я не смог ее решить.

Цель проста: я хочу извлечь из 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_coordinate и Y_coordinate) и получить их для удаления рекламы для других целей.

Я попытался скопировать следующее решение ( как вернуть значение изbutton_press_event matplotlib? ), чтобы попытаться извлечь X_coordinate, но он не работает:

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()

Любая помощь будет по достоинству оценена

1 Ответ

0 голосов
/ 10 июня 2019

Я думаю, что проблема может заключаться в использовании mutable_object ['click'] в определении функции и mutable_object ['key'] вне функции.Ключ 'key' отсутствует в словаре mutable_object.

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()
...