|
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() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|