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.

89 lines
2.8 KiB

import pyrealsense2 as rs
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import cv2
# RS_WIDTH = 1280
# RS_HEIGHT = 720
RS_WIDTH = 640
RS_HEIGHT = 480
class RealSenseInterface:
def noCameraFound(self):
print("RealSense camera not found. Check the connection.")
class ImageAcquisition(RealSenseInterface):
def __init__(self):
try:
self.__pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, RS_WIDTH, RS_HEIGHT, rs.format.z16, 30)
config.enable_stream(rs.stream.color, RS_WIDTH, RS_HEIGHT, rs.format.bgr8, 30)
self.__pipeline.start(config)
except:
self.noCameraFound()
exit()
def get_depth_image(self):
frames = self.__pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
return np.asanyarray(depth_frame.get_data()) if depth_frame else None
def get_color_image(self):
frames = self.__pipeline.wait_for_frames()
color_frame = frames.get_color_frame()
return np.asanyarray(color_frame.get_data()) if color_frame else None
def stop(self):
self.__pipeline.stop()
class ImageDisplay(RealSenseInterface):
def display_images(self, depth_image, color_image):
fig, (ax1, ax2) = plt.subplots(1, 2)
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
ax1.imshow(depth_colormap, cmap='jet')
ax2.imshow(color_image)
plt.show()
class ImageSaver(RealSenseInterface):
def save_image(self, image, filename):
cv2.imwrite(filename, image)
class RealSenseController:
def __init__(self):
self.acquisition = ImageAcquisition()
self.display = ImageDisplay()
self.saver = ImageSaver()
def start(self):
print("RealSense 3D camera detected.")
fig, (ax1, ax2) = plt.subplots(1, 2)
depth_im = ax1.imshow(np.zeros((RS_HEIGHT, RS_WIDTH, 3)), cmap='jet')
color_im = ax2.imshow(np.zeros((RS_HEIGHT, RS_WIDTH, 3)), cmap='jet')
def update(frame):
depth_image = self.acquisition.get_depth_image()
color_image = self.acquisition.get_color_image()
if depth_image is not None and color_image is not None:
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
depth_im.set_array(depth_colormap)
color_im.set_array(color_image)
self.saver.save_image(color_image, "color_image.png")
ani = FuncAnimation(fig, update, blit=False, cache_frame_data=False)
fig.canvas.manager.window.wm_geometry("+0+0")
plt.show()
self.acquisition.stop()