73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
import json
|
|
import math
|
|
import argparse
|
|
|
|
def calculate_distance(point1, point2):
|
|
"""Berechnet den euklidischen Abstand zwischen zwei 3D-Punkten."""
|
|
return math.sqrt(sum([(a - b) ** 2 for a, b in zip(point1, point2)]))
|
|
|
|
def analyze_marker_detection(detected_markers_file, original_markers_file):
|
|
"""Analysiert die Markererkennung und gibt Erkennungsrate und Genauigkeit aus."""
|
|
|
|
with open(detected_markers_file, 'r') as f:
|
|
detected_data = json.load(f)
|
|
|
|
with open(original_markers_file, 'r') as f:
|
|
original_data = json.load(f)
|
|
|
|
detected_marker_ids = {marker['marker_id'] for marker in detected_data['markers']}
|
|
original_marker_ids = {marker['id'] for marker in original_data}
|
|
|
|
# Erkannte und nicht erkannte Marker
|
|
recognized_markers = len(detected_marker_ids.intersection(original_marker_ids))
|
|
missing_markers = len(original_marker_ids.difference(detected_marker_ids))
|
|
|
|
# Distanzen berechnen
|
|
distances = []
|
|
for original_marker in original_data:
|
|
marker_id = original_marker['id']
|
|
|
|
# Gefundener Marker suchen
|
|
detected_marker = next((m for m in detected_data['markers'] if m['marker_id'] == marker_id), None)
|
|
|
|
if detected_marker:
|
|
distance = calculate_distance(original_marker['position_m'], detected_marker['position_m'])
|
|
distances.append(distance)
|
|
|
|
if not distances:
|
|
print("Keine gemeinsamen Marker gefunden, um die Genauigkeit zu bewerten.")
|
|
return
|
|
|
|
# Statistiken berechnen
|
|
distances.sort()
|
|
mean_distance = sum(distances) / len(distances)
|
|
|
|
# 90%-Radius
|
|
n = len(distances)
|
|
index_90 = int(0.9 * n) - 1
|
|
radius_90 = distances[index_90]
|
|
|
|
# 80%-Radius
|
|
index_80 = int(0.8 * n) - 1
|
|
radius_80 = distances[index_80]
|
|
|
|
# Schlechtester Abstand
|
|
worst_distance = distances[-1]
|
|
|
|
print(f"Erkannte Marker: {recognized_markers}")
|
|
print(f"Nicht erkannte Marker: {missing_markers}")
|
|
print(f"Gesamtzahl der Original-Marker: {len(original_marker_ids)}")
|
|
print(f"Erkennungsrate: {recognized_markers / len(original_marker_ids) * 100:.2f}%")
|
|
print(f"Gemittelter 3D-Abstand: {mean_distance:.4f}m")
|
|
print(f"90%-Radius: {radius_90:.4f}m")
|
|
print(f"80%-Radius: {radius_80:.4f}m")
|
|
print(f"Schlechtester Abstand: {worst_distance:.4f}m")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(description="Analysiert die Markererkennung.")
|
|
parser.add_argument("detected_file", help="Pfad zur JSON-Datei mit den erkannten Markern.")
|
|
parser.add_argument("original_file", help="Pfad zur JSON-Datei mit den originalen Markern.")
|
|
args = parser.parse_args()
|
|
|
|
analyze_marker_detection(args.detected_file, args.original_file) |