Voir les articles précédents: Algorithme de reconnaissance de mouvement simple et un algorithme pour trouver le déplacement d'objets dans l'image . Permettez-moi de vous rappeler que j'ai été motivé pour écrire ces articles par le fait que lorsque j'ai commencé à travailler sur mon mémoire de maîtrise sur "L'analyse de la structure spatiale des images dynamiques", je me suis heurté au problème qu'il est très difficile de trouver des exemples tout faits d'algorithmes de reconnaissance d'images et d'objets en mouvement. Partout, tant dans la littérature que sur Internet, il n'y a qu'une seule théorie nue. Beaucoup de temps s'est écoulé depuis, j'ai réussi à défendre ma thèse et à recevoir un diplôme rouge, et maintenant j'écris pour partager mon expérience.
Ainsi, lorsque j'ai commencé à travailler sur mes thèses, mes connaissances dans le domaine de la vision par ordinateur étaient nulles. Où ai-je commencé? Des expériences les plus simples sur des images, qui sont décrites dans les articles ci-dessus. J'ai écrit quelques algorithmes primitifs, dont l'un m'a montré sous la forme de points où se trouvent des objets en mouvement, et le second a trouvé un morceau de l'image dans une image plus grande (cela a fonctionné, naturellement, lentement).
Et après? Plus de branchement. Ma tâche était pour le véhicule aérien sans pilote de naviguer à travers la photographie aérienne ou de suivre une voiture se déplaçant le long de la route. Et je ne savais pas comment commencer la tâche. Qu'est-ce que j'ai commencé à faire? Lisez la théorie. Et la théorie dit que la vision par ordinateur se décompose en étapes suivantes:
- Prétraitement de l'image (suppression du bruit, amélioration du contraste, mise à l'échelle, etc.).
- Recherche de détails (lignes, bordures, points d'intérêt)
- Détection, segmentation.
- Traitement de haut niveau.
Bon, ok, j'ai dessiné un schéma du programme qui devrait faire tout ça:
Bref, il s'est avéré que je devais créer quelque chose de grandiose au niveau de l'intelligence artificielle. Bon ok, je vais essayer de le créer. Je prends Visual Studio et commence à sculpter des classes en C #. Plus précisément, des blancs de classe. Un peu plus tard, j'ai réalisé ce que je visais….
Alors, je commence à pratiquer la première étape. Prétraitement. J'ai commencé avec elle parce que
- C'est le plus simple.
- C'est la première étape de la liste.
J'ai commencé à appliquer différents filtres à l'image, pour voir ce qui s'était passé. Par exemple, j'ai essayé d'appliquer le filtre Sobel:
Supprimer le bruit de l'image en utilisant le flou gaussien: j'ai
étudié le filtrage médian et la sélection des contours:
une conférence sur la vision par ordinateur depuis la salle de conférence m'a beaucoup aidé .
Ainsi, la connaissance est devenue beaucoup plus, mais on ne sait toujours pas comment résoudre le problème. À ce moment-là, le sujet et la tâche de la thèse de maîtrise avaient été révisés à plusieurs reprises et, par conséquent, ils étaient formulés comme suit: «Suivi de la trajectoire d'un drone à l'aide de cadres de photographie aérienne». Autrement dit, j'avais besoin de prendre un certain nombre de photographies et de construire une trajectoire le long d'elles.
J'ai eu l'idée de décrire le contour sous forme de lignes brisées (décrites par de nombreux segments), puis de comparer à quel point ces lignes se sont décalées. Mais il s'est avéré que les contours, même dans deux cadres adjacents, se sont révélés si différents qu'il n'y avait aucun moyen de comparer correctement les ensembles des lignes brisées résultantes. J'ai essayé d'améliorer les contours eux-mêmes en utilisant différentes méthodes et leurs combinaisons:
- Sélection d'arêtes Canny classique à partir de la bibliothèque OpenCV
- Amélioration de l'algorithme de détection des contours développé par mon superviseur.
- Sélection des contours par binarisation.
- Sélection des contours par segmentation. La segmentation a été réalisée de diverses manières, en particulier à l'aide de caractéristiques de texture.
En conséquence, nous avons obtenu un fouillis d'algorithmes qui ont fonctionné très lentement mais qui n'ont pas rapproché un iota du résultat. Certains de mes travaux ont été utilisés comme matériaux pour cet article .
Eh bien, alors le superviseur a suggéré une idée: il est nécessaire d'utiliser des points spéciaux. Et il a même donné un algorithme sur la façon de calculer ces points clés. Je dois dire que c'était une méthode très atypique. Ce n'est pas un détecteur Harris, ni BRISK, ni MSER, ni AKAZE. Bien que j'aie essayé de les utiliser aussi. Mais il s'est avéré que le détecteur proposé par le superviseur fonctionnait mieux. Et voici comment cela fonctionne. Tout d'abord, nous calculons la préparation du contour en utilisant cette formule:
Ensuite, nous trouvons les extrema de cette fonction. Ce sont les points spéciaux. Fait révélateur, les points peuvent être de deux types "Peaks" et "Pits". Voici un exemple de ces points dans l'image:
Ensuite, 50 points avec la réponse maximale sont sélectionnés parmi les points obtenus. Pour tous ces points, des triangles sont construits, le nombre de triangles formés par ces points est:
où k est le nombre de points singuliers impliqués dans le calcul. Pour chaque triangle, un index spécial est calculé de 0 à 16383. L'étape suivante consiste à répartir les triangles sur un tableau spécial dans lequel le numéro de cellule correspond à l'index du triangle. Chaque cellule d'un tel tableau est une liste de triangles. Un tel tableau est compilé par deux cadres comparés. Les comparaisons sont effectuées en faisant correspondre chaque cellule du tableau avec la cellule correspondante du tableau d'une autre trame. Au total, 16 384 groupes doivent être mis en correspondance, ce qui est une tâche assez réalisable pour un ordinateur dans un laps de temps assez court.
Lors de la mise en correspondance de tableaux, nous remplissons la matrice correspondante. La matrice horizontalement correspond aux angles entre les triangles appariés et l'échelle verticale est l'échelle, qui est calculée comme le rapport des longueurs des côtés les plus longs. L'échelle et l'angle trouvés sont la cellule de la matrice qui a le plus de correspondances. Une comparaison similaire est faite pour calculer le déplacement horizontal et vertical des images.
En savoir plus sur cette méthode dans l'article.
Ainsi, nous avons trouvé le déplacement horizontal et vertical, l'angle et le changement d'échelle (c'est-à-dire que le drone montait ou descendait). Il reste maintenant à écrire un programme qui simule le tracé d'une trajectoire sur une série de trames et dessine cette trajectoire même, et on peut dire que la thèse est prête: