[cam_pose_charuco_board]
- some experiements with board angle calculation - added rotMat to Euler
This commit is contained in:
@@ -7,6 +7,21 @@ import math
|
|||||||
|
|
||||||
CAM_CALIB_FILE = "results/cam_calib_charuco.npz"
|
CAM_CALIB_FILE = "results/cam_calib_charuco.npz"
|
||||||
|
|
||||||
|
def rotation_matrix_to_euler_angles(R):
|
||||||
|
sy = math.sqrt(R[0,0]**2 + R[1,0]**2)
|
||||||
|
singular = sy < 1e-6
|
||||||
|
|
||||||
|
if not singular:
|
||||||
|
x = math.atan2(R[2,1] , R[2,2])
|
||||||
|
y = math.atan2(-R[2,0], sy)
|
||||||
|
z = math.atan2(R[1,0], R[0,0])
|
||||||
|
else:
|
||||||
|
# Handle singularity
|
||||||
|
x = math.atan2(-R[1,2], R[1,1])
|
||||||
|
y = math.atan2(-R[2,0], sy)
|
||||||
|
z = 0
|
||||||
|
return np.array([x, y, z])
|
||||||
|
|
||||||
def factory(dict_type: int, board_size: cv.typing.Size, square_length: float=5.0, marker_length: float=3.0):
|
def factory(dict_type: int, board_size: cv.typing.Size, square_length: float=5.0, marker_length: float=3.0):
|
||||||
aruco_dict = cv.aruco.getPredefinedDictionary(dict_type)
|
aruco_dict = cv.aruco.getPredefinedDictionary(dict_type)
|
||||||
board = cv.aruco.CharucoBoard(board_size, square_length, marker_length, aruco_dict)
|
board = cv.aruco.CharucoBoard(board_size, square_length, marker_length, aruco_dict)
|
||||||
@@ -70,6 +85,7 @@ def process_video(detector: cv.aruco.CharucoDetector, board):
|
|||||||
|
|
||||||
img_size = None
|
img_size = None
|
||||||
last_rotation = [0,0,0]
|
last_rotation = [0,0,0]
|
||||||
|
use_euler_angle = True
|
||||||
while True:
|
while True:
|
||||||
# Read a new frame
|
# Read a new frame
|
||||||
ok, img = cap.read()
|
ok, img = cap.read()
|
||||||
@@ -94,10 +110,16 @@ def process_video(detector: cv.aruco.CharucoDetector, board):
|
|||||||
else:
|
else:
|
||||||
r_vec, t_vec = process(detector, board, img, mtx, dist, None, None)
|
r_vec, t_vec = process(detector, board, img, mtx, dist, None, None)
|
||||||
if r_vec is not None:
|
if r_vec is not None:
|
||||||
rotation = [int(180.0 / math.pi * v) for v in r_vec[:, 0]]
|
if use_euler_angle:
|
||||||
if last_rotation != rotation:
|
r_mat = np.ndarray((3,3))
|
||||||
print(f"Rotation X|Y|Z: {rotation[0]:.1f} | {rotation[1]:.1f} | {rotation[2]:.1f}")
|
cv.Rodrigues(r_vec, r_mat)
|
||||||
last_rotation = rotation
|
res = rotation_matrix_to_euler_angles(r_mat)
|
||||||
|
else:
|
||||||
|
res = r_vec
|
||||||
|
rot = [int(180.0 / math.pi * v) for v in res]
|
||||||
|
if rot != last_rotation or True:
|
||||||
|
print(f"Rotation X|Y|Z: {rot[0]:.1f} | {rot[1]:.1f} | {rot[2]:.1f}")
|
||||||
|
last_rotation = rot
|
||||||
|
|
||||||
cv.imshow('img', img)
|
cv.imshow('img', img)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user