Matplotlib ginput заставляет изображение не появляться - PullRequest
0 голосов
/ 06 апреля 2020

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

hanging execution

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

interrupted kernel

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...