Как реализовать сборщик строк matplotlib с помощью opencv? - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы выбрать линии, нарисованные на изображении, используя cv2.line, и что-то с ними сделать.Чтобы понять, что я взглянул на подборщик matplotlibs и даже нашел хороший пример здесь .Поскольку я собираюсь использовать tkinter для графического интерфейса, я добавил его в свой MWE.

Код из примера, который отлично работает:

import sys
if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import numpy as np

root = Tk.Tk()
root.iconify()

x = np.linspace(0, 10, 100)

fig, ax = plt.subplots()
for i in range(1, 10):
    ax.plot(x, i * x + x, picker=5)

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def on_pick(event):
    event.artist.set_visible(not event.artist.get_visible())
    fig.canvas.draw()

fig.canvas.callbacks.connect('pick_event', on_pick)

root.mainloop()

Сейчасмой код с использованием OpenCV, который не работает:

import sys
if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
   import tkinter as Tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
import cv2

root = Tk.Tk()
root.iconify()

img = np.zeros([100,100,3],dtype=np.uint8)
img.fill(255)
cv2.line(img,(10,10),(60,90),(100,149,237),2)

fig = Figure()
ax = fig.add_subplot(111)
ax.set_aspect('equal')
ax.plot()
ax.imshow(img)

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def onpick1(event):
    event.artist.set_visible(not event.artist.get_visible())        
    fig.canvas.draw()

fig.canvas.callbacks.connect('pick_event', onpick1)

root.mainloop()

В обоих примерах onpick1 должен включать или отключать видимость линий одним щелчком мыши, но это не так.Я предполагаю, что это как-то связано с тем, как оно наносится на график, или с тем, как я рисую линии (ax.plt против cv2.line).Я был бы очень рад любой помощи.Спасибо!

...