You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.0 KiB
91 lines
3.0 KiB
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
|
|
|
|
class ImageViewer:
|
|
def __init__(self, title="Image Viewer", figsize=(8, 6), num_images=1, image_titles=None):
|
|
self.title = title
|
|
self.figsize = figsize
|
|
self.num_images = num_images
|
|
self.image_titles = image_titles or [f"Camera {i+1}" for i in range(num_images)]
|
|
|
|
# Enable interactive mode before creating subplots
|
|
plt.ion()
|
|
|
|
if num_images == 1:
|
|
self._fig, self._ax = plt.subplots(figsize=self.figsize)
|
|
self._ax.set_title(self.title)
|
|
self._im = self._ax.imshow(np.zeros((100, 100)))
|
|
self._ax.axis("off")
|
|
self._axes = [self._ax]
|
|
self._images = [self._im]
|
|
else:
|
|
# Calculate grid dimensions
|
|
cols = min(num_images, 3) # Max 3 columns
|
|
rows = (num_images + cols - 1) // cols
|
|
|
|
# Adjust figure size based on number of images
|
|
fig_width = self.figsize[0] * min(cols, 2)
|
|
fig_height = self.figsize[1] * rows / 2
|
|
|
|
self._fig, axes = plt.subplots(rows, cols, figsize=(fig_width, fig_height))
|
|
self._fig.suptitle(self.title)
|
|
|
|
# Flatten axes array for easier access
|
|
if num_images == 2:
|
|
axes = [axes[0], axes[1]]
|
|
elif rows == 1:
|
|
axes = axes if cols > 1 else [axes]
|
|
else:
|
|
axes = axes.flatten()
|
|
|
|
self._axes = []
|
|
self._images = []
|
|
|
|
for i in range(num_images):
|
|
ax = axes[i]
|
|
ax.set_title(self.image_titles[i])
|
|
im = ax.imshow(np.zeros((100, 100)))
|
|
ax.axis("off")
|
|
self._axes.append(ax)
|
|
self._images.append(im)
|
|
|
|
# Hide unused subplots
|
|
for i in range(num_images, len(axes)):
|
|
axes[i].set_visible(False)
|
|
|
|
# Show the figure initially to make window appear
|
|
self._fig.show()
|
|
|
|
def show(self, image_array):
|
|
"""Show a single image (backward compatibility)"""
|
|
if self.num_images == 1:
|
|
self._images[0].set_data(image_array)
|
|
else:
|
|
# If multiple viewers but single image provided, show in first viewer
|
|
self._images[0].set_data(image_array)
|
|
|
|
# non-blocking update
|
|
self._fig.canvas.draw_idle()
|
|
self._fig.canvas.flush_events()
|
|
|
|
def show_multiple(self, images):
|
|
"""Show multiple images"""
|
|
for i, img in enumerate(images):
|
|
if i < len(self._images) and img is not None:
|
|
self._images[i].set_data(img)
|
|
# Auto-adjust aspect ratio
|
|
self._axes[i].set_aspect("auto")
|
|
|
|
# non-blocking update
|
|
self._fig.canvas.draw_idle()
|
|
self._fig.canvas.flush_events()
|
|
|
|
def close(self):
|
|
plt.close(self._fig)
|
|
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
self.close()
|