Jitter/Sprünge in der Kamera -Pose -Schätzung unter Verwendung von Aruco -MarkernPython

Python-Programme
Guest
 Jitter/Sprünge in der Kamera -Pose -Schätzung unter Verwendung von Aruco -Markern

Post by Guest »

Ich arbeite an einem Projekt, um die Kamera -Pose mit statischen Aruco -Markern zu verfolgen. Markierungen werden überall in einem Raum platziert und wir kennen ihre Pose. Die Kamera bewegt sich und sieht die Marker und schätzt ihre Pose. Mit dieser und der tatsächlichen Pose des Markers finden wir die geschätzte Pose der Kamera. Ich habe eine Lösung mit OpenCV und Python implementiert, aber ich habe erhebliche Jitter oder Sprünge in der geschätzten Kamera -Pose, insbesondere wenn die Kamera in aufeinanderfolgenden Rahmen verschiedene Markierungen sieht. < /P>
Hier ist hier Der Code: < /p>
import cv2
import numpy as np
import matplotlib.pyplot as plt

# Intrinsic camera parameters
camera_matrix = np.array([
[522.67889404, 0, 648.63323975],
[0, 522.67889404, 365.60263062],
[0, 0, 1]
])

# Distortion coefficients
dist_coeffs = np.zeros(5)

# Marker size in meters
marker_size = 0.03

# Known ArUco marker poses in world coordinates
marker_poses_world = {
1: {'position': [-0.0366, 0.1280, 0.2941], 'rvec': np.array([0, -np.pi/2, 0], dtype=np.float32)},
# ... (other markers)
}

# Load the predefined dictionary
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250)
parameters = cv2.aruco.DetectorParameters()
detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)

# Function to convert rvec and tvec to a transformation matrix
def pose_to_transformation(rvec, tvec):
rotation_matrix, _ = cv2.Rodrigues(rvec)
transformation_matrix = np.eye(4)
transformation_matrix[:3, :3] = rotation_matrix
transformation_matrix[:3, 3] = tvec.flatten()
return transformation_matrix

# Open video input
video_path = "test2.mp4"
cap = cv2.VideoCapture(video_path)

paused = False

try:
while cap.isOpened():
if not paused:
ret, frame = cap.read()
if not ret:
break

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
corners, ids, rejected = detector.detectMarkers(gray)

if ids is not None and len(ids) > 0:
rvecs, tvecs, _ = cv2.aruco.estimatePoseSingleMarkers(
corners, marker_size, camera_matrix, dist_coeffs)

for i in range(len(ids)):
marker_id = ids[0]
print(f"Detected Marker ID: {marker_id}")

cv2.aruco.drawDetectedMarkers(frame, corners, ids)
cv2.drawFrameAxes(frame, camera_matrix, dist_coeffs, rvecs, tvecs, 0.1)

T_cam_marker = pose_to_transformation(rvecs, tvecs)
print(f"Marker {marker_id} Transformation Matrix (Camera Frame):\n", T_cam_marker)

if marker_id in marker_poses_world:
marker_data = marker_poses_world[marker_id]
T_world_marker = np.eye(4)
T_world_marker[:3, 3] = marker_data['position']
R_world_marker, _ = cv2.Rodrigues(marker_data['rvec'])
T_world_marker[:3, :3] = R_world_marker
T_world_cam = T_world_marker @ np.linalg.inv(T_cam_marker)

camera_position_world_meters = T_world_cam[:3, 3]
camera_position_world_cm = camera_position_world_meters * 100

print(f"Camera Position (World): X: {camera_position_world_cm[0]:.2f}cm, Z: {camera_position_world_cm[2]:.2f}cm")
print("Camera Transformation Matrix:\n", T_world_cam)

cv2.imshow("Video Input Pose Estimation", frame)

key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord(' '):
paused = not paused
finally:
cap.release()
cv2.destroyAllWindows()
< /code>
Trotz der Implementierung weisen die Schätzungen der Kamera -Pose immer noch signifikante Jitter auf, insbesondere wenn verschiedene Markierungen in aufeinanderfolgenden Rahmen erkannt werden. Meine Video- und Codeausgabekarte: Image FrameImage Frame 2Output 2D -Karte < /p>
Fragen: < /p>

Gibt es zusätzliche Techniken oder zusätzliche Techniken oder Filter Ich kann die Schätzungen der Kamera -Pose -Schätzungen auf
anwenden? >
Würde die Implementierung einer Kalman -Filterhilfe in diesem Szenario und wenn ja, wie kann ich ihn in den vorhandenen Code integrieren? < /li>
< /ol>
Any Erkenntnisse oder Vorschläge wären sehr geschätzt!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post