Question

Je travaille sur une structure de demande de mouvement et je le suivi d'un certain nombre de marqueurs placés sur l'objet pour déterminer la structure rigide de l'objet.

L'application est essentiellement en utilisant la norme d'optimisation Levenberg-Marquardt sur plusieurs vues de la caméra et de minimiser les différences entre les points de marquage attendus et les points de marquage obtenues en 2D à partir de chaque point de vue.

Pour chaque point de repère et chaque vue de la fonction suivante est minimisée:

double diff = calculatedXY[index] - observedXY[index]

Lorsque la valeur calculatedXY dépend d'un certain nombre de paramètres inconnus qui doivent être trouvés via l'optimisation et observedXY est la position du point de repère en 2D. Au total, j'ai (points de repère * vues) nombre de fonctions comme celle-ci que je vise à réduire au minimum.

J'ai codé une simulation de la caméra voir tous les points de repère, mais je me demandais comment gérer les cas où au cours de l'exécution des points ne sont pas visibles en raison de l'éclairage, l'occlusion ou tout simplement ne pas être dans la vue de la caméra. Dans le vrai fonctionnement de l'application que je vais utiliser une webcam pour voir l'objet il est donc probable que tous les marqueurs seront visibles à la fois et en fonction de la robustesse de mon algorithme de vision par ordinateur est, je ne pourrais pas être en mesure de détecter un marker tout le temps.

Je pensais que de définir la valeur diff être 0 (sigma carré différence = 0) dans le cas où le point de repère n'a pas pu être observée, ce biais pourrait cependant les résultats?

Une autre chose que je remarque est que l'algorithme est pas aussi bon lorsqu'il est présenté avec trop de points de vue. Il est plus probable d'estimer une mauvaise solution lorsqu'ils sont présentés avec trop de points de vue. Est-ce un problème commun avec réglage ensemble en raison de l'augmentation de la probabilité de frapper un minimum local lorsqu'ils sont présentés avec trop de vues?

Était-ce utile?

La solution

Il est pratique courante à un congé juste en termes correspondant aux marqueurs manquants. C'est à dire. ne pas essayer de minimiser calculateXY-observedXY s'il n'y a pas de terme observedXY. Il n'y a pas besoin de quoi que ce soit réglé à zéro, vous ne devriez pas même d'envisager ce terme en premier lieu -. Il suffit de sauter (ou, je suppose que dans votre code, il est équivalent à définir l'erreur à zéro)

Réglage Bundle peut échouer terriblement si vous jetez simplement un grand nombre d'observations dans ce domaine. Construisez votre solution incrémentielle en résolvant avec quelques vues d'abord, puis continuer à ajouter.

Vous pouvez essayer une sorte d'approche « robuste ». Au lieu d'utiliser des moindres carrés, utilisez une « fonction de perte » 1 . Ceux-ci permettent à votre optimisation de survivre même s'il y a une poignée d'observations qui sont incorrectes. Vous pouvez toujours le faire dans un cadre Levenberg-Marquardt, il vous suffit d'incorporer la dérivée de votre fonction de perte dans le jacobien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top