IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Déterminer le déplacement d'un objet sur base de deux photos


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Specialiste DataCenter
    Inscrit en
    Juin 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Specialiste DataCenter

    Informations forums :
    Inscription : Juin 2015
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Déterminer le déplacement d'un objet sur base de deux photos
    Bonjour,

    Je recherche a faire une sorte de "tourelle" photographique (principalement pour l’observation spatial) et j'aimerais donc savoir comparer deux photo et de déterminer le niveau de déplacement d'un objet dessus.


    Exemple :

    Photo 1
    Nom : Dessin sans titre.png
Affichages : 664
Taille : 4,7 Ko

    Photo 2
    Nom : Dessin sans titre (1).png
Affichages : 677
Taille : 4,7 Ko

    Pour ainsi déterminer le déplacement en X et Y (en pixel c'est deja parfait )
    Nom : Dessin sans titre (2).png
Affichages : 703
Taille : 16,3 Ko


    Le resultat de X et Y est ensuite envoyer a un PLC qui fera le mouvement


    J'ai pas mal chercher sur le net et honnêtement je trouve pas vraiment de solution adapter a mon problème.

    De base j'utilise Stellarium qui m'envois les coordonnée d'une étoile en presque temps réel, mais j'aimerais pouvoir aller plus loi pour faire du hot tracking d'objet en mouvement ( Lune, satelites, ISS, voir avions, oiseaux, etc.. )


    Mon idée c'est de rajouter un viseur avec une petite optique, un appareil photo, et le script ferais ceci :


    //Start

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    photo1 = Prendre.photo();
    delay(1000);
    while(start) 
    {
       photo2 = Prendre.photo();
       X = compare(photo1, photo2, x);
       Y = compare(photo1, photo2, y);
       Print(x, " -  ", y);
       photo1 = photo2;
       delay(1000);
    }



    Pouvez vous m'aidez ou me donner le chemin a suivre ? Merci

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonsoir

    Je n'ai pas vraiment saisi : vous voulez déplacer un objet étant donné un vecteur de déplacement connu, ou bien calculer un vecteur de déplacement entre 2 images ?

    Sous quel format stocker vous l'information de vos points détecter ? Ce serait pas mal de donner un petit bout de code, sans fournir les images, juste en donnant ce qui est détecté sur les images, qu'on voit un peu le format.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Specialiste DataCenter
    Inscrit en
    Juin 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Specialiste DataCenter

    Informations forums :
    Inscription : Juin 2015
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Hello,

    Citation Envoyé par lg_53 Voir le message
    Bonsoir

    Je n'ai pas vraiment saisi : vous voulez déplacer un objet étant donné un vecteur de déplacement connu, ou bien calculer un vecteur de déplacement entre 2 images ?.
    Non je souhaite juste suivre un objet photographier et déterminer son déplacement pour envoyer ses infos au cerveau moteur, et donc, calculer un vecteur de déplacement entre 2 images



    Citation Envoyé par lg_53 Voir le message
    Sous quel format stocker vous l'information de vos points détecter ? Ce serait pas mal de donner un petit bout de code, sans fournir les images, juste en donnant ce qui est détecté sur les images, qu'on voit un peu le format.
    Juste deux nombre, X et Y

    Par exemple si la deuxième photo est déplacer de 40 pixel vers la droite et 20 vers le bas : > 20 - 40
    si c'est en haut a gauche : -20 -40

    Etc..
    Je n'ai pas encore de bout de code car je vois pas trop comment faire cela ou s'il existe un logiciel qui existe déjà.

    Merci !

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par Gruniek Voir le message
    Juste deux nombre, X et Y
    .

    Non ca c'est la forme du résultat voulu, mais ma question portait aussi sur les données d'entrée !
    Vos images, quelle est le format de donnée qui les représente ? Une matrice de pixel avec des 0 si c'est blanc et des 1 si c'est noir ?
    Ou bien juste une liste de couple (x_i, y_i) indiquant l'emplacement des points blancs ? Ou bien autre chose encore ?
    Et donc du coup vous devriiez déjà au moins avoir du code pour la lecture de chacune des images.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Specialiste DataCenter
    Inscrit en
    Juin 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Specialiste DataCenter

    Informations forums :
    Inscription : Juin 2015
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    En entrée ça serait juste deux photos prise via un appareil dédier, donc le script déclencherais la capture de photo pour faire la comparaison.
    Je voyais ensuite partir sur une variable a deux tableau ou y serait intégrer l'image (au préalable traiter avant en monochrome)
    ensuite c'est un peu floue, j'ai ma petite idée mais j'ai peur que ca enduit trop d’opération pour respecter un bon ratio de traitement par seconde, dans les cas les plus rapide, serait quand une a deux mise a jour des coordonnée par seconde.

    Et je n'ai pas encore de code actuellement car je suis qu'au stade de l’étude et la faisabilité du programme
    Par contre je vais commencer sous peu l’écriture pour la capture de l'image, c'est vrai que dans tous les cas, j'en aurai besoin.

    Je posterais ici le code quand il sera fait

    Merci

  6. #6
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Le temps d'exécution est secondaire pour le moment. Vous devez déjà avoir un code qui fonctionne correctement avant de vous demander s'il tourne suffisamment vite pour faire du temps réel. Si vos images ne sont pas plus grosses que ca, ca prend tout de même pas beaucoup de temps à Python de traiter environ un millier de pixel. A moins de vouloir un rafraichissement de l'ordre de la millisecondes, et encore ...

    Donc commençons par le début.

    Pour lire les images, on peut regarder :
    https://deptinfo-ensip.univ-poitiers...ui:tuto_images

    Ensuite, il faut passer d'une matrice de pixels, à une liste de pixel d'intérêt. Si vos pixel d'intérêt sont tous blanc, alors un np.argwhere devrait suffire.

    Puis ensuite une fois que vous avez vos listes de pixels d'intérêt sur chacune de vos images, vous en faite la différence point par point.

    Enfin, soit votre déplacement est parfait (pas de distortion physique), et donc toutes les différences sont égales, soit (ce qui me semble plus réaliste), vous aurez des déplacements qui ne seront pas tout à fait les mêmes. Dans ce dernier cas, là à vous de voir quelle est l'information que vous voulez en tirer, mais de prime à bord, la moyenne des déplacements sera déjà pas mal.

    Dans tout ce que je viens de dire, ça représente vraiment pas beaucoup de ligne de code. Prenez les 2 images de votre 1er post, et essayez d'écrire le code pour calculer le déplacement entre elles 2, avec les étapes que je vous ai donné.

    EDIT : Sur votre image, je n'arrive pas à bien voir si 1 point = 1 pixel, ou bien si 1 point blanc est un ensemble de pixel. Si le point est un ensemble de pixel, alors effectivement là il y a un peu plus de travail. La manière la plus rapide (en temps d'execution) serait surement du machine learning avec des réseaux de neuronnes convolutionnels. Et si vous n'etes pas famillier de ca comme, là je pense que c'est assez simple de faire un traitement à la main (par exemple en downsamplant vos images, de sortes à réduire le nombre de pixel par points blancs).
    Ou alors, on peut très bien considérer que 1 point blanc = plusieurs pixels = autant de points d'intérêt (car finalement on s'en fiche si c'est un point c'est une ou plusieurs données, si à la fin, on veut le déplacement moyen ! )

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Specialiste DataCenter
    Inscrit en
    Juin 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Specialiste DataCenter

    Informations forums :
    Inscription : Juin 2015
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Parfait avec cela j'ai déjà de quoi pouvoir avancer pas mal !

    Je reviendrais vers vous d'ici vendredi ou samedi suivant mon temps libre


    Merci !

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    perso je ferais ainsi:

    pointer une étoile
    délimiter un espace de quelques pixels autour
    à chaque image:
    --chercher dans cette zone le pixel le plus lumineux
    --aligner la monture

    je pense que c'est plus simple que de suivre un groupe d'étoiles

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    en cherchant sur le net ça parle également de corrélation croisée

    Edit: un test qui semble concluant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import skimage  # pip install scikit-image==0.15.0 (https://github.com/scikit-image/scikit-image/pull/4502)
     
    def xcorrel(f1, f2):
        img1 = skimage.io.imread(f1)
        img2 = skimage.io.imread(f2)
        shift, error, diffphase = skimage.feature.register_translation(img1, img2)
        return dict(zip(('y', 'x'), shift[:2]))
     
    offset = xcorrel(fic1, fic2)
    print(f"offset = {offset['x']}, {offset['y']}")
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    offset = -224.0, -168.0

Discussions similaires

  1. [XL-2016] Sélectionner un cellule sur base de deux variables
    Par thomanneca dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/02/2019, 17h15
  2. [XL-2007] Rechercher une valeur sur base de deux critères
    Par HIGGUINS dans le forum Excel
    Réponses: 2
    Dernier message: 10/11/2010, 18h28
  3. Déplacement journal de transaction sur base en Log Shipping
    Par tibal dans le forum Administration
    Réponses: 4
    Dernier message: 15/07/2010, 07h38
  4. [XSD] [XML Schemas] Valider un Objet sur base du schéma
    Par Invité dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 27/03/2009, 14h10
  5. Réponses: 8
    Dernier message: 14/02/2007, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo