Я пытаюсь использовать matlabplot.pyplot.ginput
в блокноте Jupyter для выбора точек на изображении, однако при вызове ginput
изображение не появляется. Вместо этого он зависает, как будто ячейка все еще работает, но изображение не появляется. Если я опускаю вызов на ginput
, я вижу, что изображение отображается очень хорошо.

Интересно, если я прерву ядро, изображение появляется (хотя я не могу с ним взаимодействовать), и я получаю трассировку стека (вставлено ниже):

My код:
import cv2
import numpy as np
import matplotlib.pyplot as plt
source_img = cv2.imread('foo.jpg')
def specify_points(img):
fig = plt.figure()
fig.set_label('Select corresponding points in the image')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.axis('off')
return plt.ginput(1)
%matplotlib notebook
source_points = specify_points(source_img)
Трассировка стека при прерывании ядра:
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
<ipython-input-4-8652456a3eae> in <module>
1 # Select corresponding points on the images
2 get_ipython().run_line_magic('matplotlib', 'notebook')
----> 3 source_points = specify_points(source_img)
<ipython-input-3-b99a0d1655ce> in specify_points(img)
9 plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
10 plt.axis('off')
---> 11 return plt.ginput(1)
~/Library/Python/3.7/lib/python/site-packages/matplotlib/pyplot.py in ginput(*args, **kwargs)
735 If *timeout* is negative, does not timeout.
736 """
--> 737 return gcf().ginput(*args, **kwargs)
738
739
~/Library/Python/3.7/lib/python/site-packages/matplotlib/figure.py in ginput(self, n, timeout, show_clicks, mouse_add, mouse_pop, mouse_stop)
2307 mouse_stop=mouse_stop)
2308 return blocking_mouse_input(n=n, timeout=timeout,
-> 2309 show_clicks=show_clicks)
2310
2311 def waitforbuttonpress(self, timeout=-1):
~/Library/Python/3.7/lib/python/site-packages/matplotlib/blocking_input.py in __call__(self, n, timeout, show_clicks)
261 self.clicks = []
262 self.marks = []
--> 263 BlockingInput.__call__(self, n=n, timeout=timeout)
264 return self.clicks
265
~/Library/Python/3.7/lib/python/site-packages/matplotlib/blocking_input.py in __call__(self, n, timeout)
90 try:
91 # Start event loop.
---> 92 self.fig.canvas.start_event_loop(timeout=timeout)
93 finally: # Run even on exception like ctrl-c.
94 # Disconnect the callbacks.
~/Library/Python/3.7/lib/python/site-packages/matplotlib/backend_bases.py in start_event_loop(self, timeout)
2265 while self._looping and counter * timestep < timeout:
2266 self.flush_events()
-> 2267 time.sleep(timestep)
2268 counter += 1
2269
KeyboardInterrupt:
Это казалось более чистым подходом, чем использование событий и mpl_connect
, но пока у меня нет Удачи.
Я использую:
- macOS Catalina 10.15.4
- Jupyter Notebook с Python 3.7.3 64-bit
- Matplotlib 3.1.2