""" DeepLabCut Toolbox (deeplabcut.org) © A. & M. Mathis Labs Licensed under GNU Lesser General Public License v3.0 """ from tkinter import Tk, Label import colorcet as cc from PIL import Image, ImageTk, ImageDraw class Display(object): """ Simple object to display frames with DLC labels. Parameters ----------- cmap : string string indicating the Matoplotlib colormap to use. pcutoff : float likelihood threshold to display points """ def __init__(self, cmap="bmy", radius=3, pcutoff=0.5): """ Constructor method """ self.cmap = cmap self.colors = None self.radius = radius self.pcutoff = pcutoff self.window = None def set_display(self, im_size, bodyparts): """ Create tkinter window to display image Parameters ---------- im_size : tuple (width, height) of image bodyparts : int number of bodyparts """ self.window = Tk() self.window.title("DLC Live") self.lab = Label(self.window) self.lab.pack() all_colors = getattr(cc, self.cmap) self.colors = all_colors[:: int(len(all_colors) / bodyparts)] def display_frame(self, frame, pose=None): """ Display the image with DeepLabCut labels using opencv imshow Parameters ----------- frame :class:`numpy.ndarray` an image as a numpy array pose :class:`numpy.ndarray` the pose estimated by DeepLabCut for the image """ im_size = (frame.shape[1], frame.shape[0]) if pose is not None: if self.window is None: self.set_display(im_size, pose.shape[0]) img = Image.fromarray(frame) draw = ImageDraw.Draw(img) for i in range(pose.shape[0]): if pose[i, 2] > self.pcutoff: try: x0 = ( pose[i, 0] - self.radius if pose[i, 0] - self.radius > 0 else 0 ) x1 = ( pose[i, 0] + self.radius if pose[i, 0] + self.radius < im_size[0] else im_size[1] ) y0 = ( pose[i, 1] - self.radius if pose[i, 1] - self.radius > 0 else 0 ) y1 = ( pose[i, 1] + self.radius if pose[i, 1] + self.radius < im_size[1] else im_size[0] ) coords = [x0, y0, x1, y1] draw.ellipse( coords, fill=self.colors[i], outline=self.colors[i] ) except Exception as e: print(e) img_tk = ImageTk.PhotoImage(image=img, master=self.window) self.lab.configure(image=img_tk) self.window.update() def destroy(self): """ Destroys the opencv image window """ self.window.destroy()