| | import cv2 |
| | import pyautogui |
| | import os |
| | from glob import glob |
| |
|
| | screen_width, screen_height = pyautogui.size() |
| |
|
| | class window: |
| | def __init__(self, name, size=None, video_path=None, video_fps=30, video_size=(480, 320), show=False): |
| | self.screen_width, self.screen_height = pyautogui.size() |
| | self.screen_width = int(self.screen_width / 2) |
| | if size is not None: |
| | self.width = size[0] |
| | self.height = size[1] |
| | else: |
| | self.width = self.screen_width |
| | self.height = self.screen_height |
| | self.video_size = video_size |
| | self.video_fps = video_fps |
| |
|
| | self.x_pos = (self.screen_width - self.width) // 2 |
| | self.y_pos = (self.screen_height - self.height) // 2 |
| | self.name = name |
| | |
| | if show: |
| | cv2.namedWindow(self.name, cv2.WINDOW_NORMAL) |
| | cv2.resizeWindow(self.name, self.width, self.height) |
| | cv2.moveWindow(self.name, self.x_pos, self.y_pos) |
| | self.video_path = video_path |
| | if video_path is not None: |
| | self.init_video() |
| |
|
| | def init_video(self): |
| | if self.video_path is not None: |
| | directory_path = f'./{self.video_path}' |
| | if not os.path.exists(directory_path): |
| | os.makedirs(directory_path) |
| | self.num = len(glob(f'./{self.video_path}/*.mp4')) |
| | fourcc = cv2.VideoWriter_fourcc(*'mp4v') |
| | self.video_writer = cv2.VideoWriter(f'./{self.video_path}/{self.num}.mp4', fourcc, self.video_fps, self.video_size) |
| | self.video_recording = False |
| | print('Video init to ', f'./{self.video_path}/{self.num}.mp4') |
| |
|
| | def show(self, img, overlay_img=None, text=None, grid=None, show=False): |
| | if overlay_img is not None: |
| | img = cv2.addWeighted(img, 1 - 0.3, overlay_img, 0.3, 0) |
| |
|
| | if text is not None: |
| | font = cv2.FONT_HERSHEY_SIMPLEX |
| | font_scale = 0.8 |
| | font_thickness = 2 |
| | font_color = (0, 0, 0) |
| | (text_width, text_height), baseline = cv2.getTextSize(text, font, font_scale, font_thickness) |
| | image_height, image_width = img.shape[:2] |
| | x = (image_width - text_width) // 2 |
| | y = (image_height - text_height) |
| | cv2.rectangle(img, (0, image_height - int(2.2 * text_height)), (image_width, image_height), (255, 255, 255), -1) |
| | cv2.putText(img, text, (x, y), font, font_scale, font_color, font_thickness, lineType=cv2.LINE_AA) |
| |
|
| | if grid is not None: |
| | |
| | cols = 4 |
| | rows = 3 |
| | for row in range(0, rows): |
| | for col in range(0, cols - 1): |
| | idx = int(cols * row + col) |
| | cv2.line(img, (int(grid[idx][0]), int(grid[idx][1])), (int(grid[idx + 1][0]), int(grid[idx + 1][1])), (0, 0, 255), 1) |
| |
|
| | for col in range(0, cols): |
| | for row in range(0, rows - 1): |
| | idx = int(cols * row + col) |
| | idx2 = idx + cols |
| | cv2.line(img, (int(grid[idx][0]), int(grid[idx][1])), (int(grid[idx2][0]), int(grid[idx2][1])), (0, 0, 255), 1) |
| | |
| | self.img = cv2.resize(img, (self.width, self.height)) |
| | if show: |
| | cv2.imshow(self.name, self.img) |
| | cv2.waitKey(1) |
| |
|
| | def video_start(self): |
| | self.video_recording = True |
| |
|
| | def video_write(self): |
| | if self.img is not None and self.video_recording is not None and self.video_writer.isOpened(): |
| | frame_resized = cv2.resize(self.img, self.video_size) |
| | self.video_writer.write(frame_resized) |
| |
|
| | def video_stop(self): |
| | self.video_recording = False |
| | print('Video saved!@!') |
| | self.video_writer.release() |
| |
|
| |
|
| | import numpy as np |
| | import matplotlib.pyplot as plt |
| | from mpl_toolkits.mplot3d import Axes3D |
| |
|
| | |
| | def rpy_to_rotation_matrix(roll, pitch, yaw): |
| | |
| | R_x = np.array([[1, 0, 0], |
| | [0, np.cos(roll), -np.sin(roll)], |
| | [0, np.sin(roll), np.cos(roll)]]) |
| | |
| | |
| | R_y = np.array([[np.cos(pitch), 0, np.sin(pitch)], |
| | [0, 1, 0], |
| | [-np.sin(pitch), 0, np.cos(pitch)]]) |
| | |
| | |
| | R_z = np.array([[np.cos(yaw), -np.sin(yaw), 0], |
| | [np.sin(yaw), np.cos(yaw), 0], |
| | [0, 0, 1]]) |
| | |
| | |
| | R = np.dot(R_z, np.dot(R_y, R_x)) |
| | return R |
| |
|
| | |
| | def visualize_xyz_rpy(x, y, z, roll, pitch, yaw): |
| | |
| | fig = plt.figure() |
| | ax = fig.add_subplot(111, projection='3d') |
| |
|
| | |
| | position = np.array([x, y, z]) |
| |
|
| | |
| | R = rpy_to_rotation_matrix(roll, pitch, yaw) |
| |
|
| | |
| | x_axis = R[:, 0] |
| | y_axis = R[:, 1] |
| | z_axis = R[:, 2] |
| |
|
| | |
| | ax.scatter([x], [y], [z], color='k', s=100, label="Position") |
| |
|
| | |
| | ax.quiver(x, y, z, x_axis[0], x_axis[1], x_axis[2], color='r', length=1.0, normalize=True, label="X-axis (roll)") |
| | ax.quiver(x, y, z, y_axis[0], y_axis[1], y_axis[2], color='g', length=1.0, normalize=True, label="Y-axis (pitch)") |
| | ax.quiver(x, y, z, z_axis[0], z_axis[1], z_axis[2], color='b', length=1.0, normalize=True, label="Z-axis (yaw)") |
| |
|
| | |
| | ax.set_xlim([x-2, x+2]) |
| | ax.set_ylim([y-2, y+2]) |
| | ax.set_zlim([z-2, z+2]) |
| |
|
| | |
| | ax.set_xlabel('X') |
| | ax.set_ylabel('Y') |
| | ax.set_zlabel('Z') |
| | ax.set_title(f'Position: ({x}, {y}, {z}), RPY: ({np.degrees(roll):.1f}, {np.degrees(pitch):.1f}, {np.degrees(yaw):.1f})') |
| |
|
| | |
| | ax.legend() |
| |
|
| | |
| | plt.show() |
| |
|
| | |
| | |
| |
|
| |
|
| | |
| |
|