Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Connecter une caméra

Sujet résolu
    17 janvier 2014 à 15:09:28

    Bonjour, 

    Je suis en train de suivre le tuto sur Arduino et je me posais une question sur les composants connectable. Est-il possible de connecter une caméra noir et blanc sur une carte Uno ?

    Mon objectif est de réaliser un logiciel embarqué de traitement d'image. La deuxième question est donc : comment récupérer les valeurs des pixels de la caméra. 

    PS : je ne souhaite en aucun cas afficher les pixels.

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2014 à 17:08:14

      FAQ de la section électronique :

      Qu'on se le dise une bonne fois pour toute. Arduino N'EST PAS fait pour faire du traitement vidéo. La puissance de calcul est ridicule pour ce genre d'activité. D'une manière plus générale, Arduino n'est pas fait pour faire du gros traitement de signal (signal ayant une fréquence élevée).

      SI tu veux faire du traitement vidéo, il faudra passer par des composants / shields externe. Fais une recherche sur le forum, ca a été évoqué plusieurs fois ces derniers mois ;)

      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        19 janvier 2014 à 12:45:02

        Etant donnée que je veux simplement détecter un objet j'ai juste à effectuer une différence entre une image échelon et l'image courante. Ce n'est donc pas un traitement lourd, et la résolution d'image ne doit pas être forcement élevé. Le processeur de la Uno est en 16MHz je pense donc monter à 5 FPS.

        Je vais continuer les recherches. Mais si j'ai bien compris il va falloir que je démonte une caméra pour récupérer le flux de données ?

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2014 à 13:20:59

          robinson des bois a écrit:

          Le processeur de la Uno est en 16MHz je pense donc monter à 5 FPS.

          Calcul ? Démonstration ?

          Je vais continuer les recherches. Mais si j'ai bien compris il va falloir que je démonte une caméra pour récupérer le flux de données ?

          Ou alors tu achètes un vrai capteur CMOS que tu interfaces directement.

          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

            19 janvier 2014 à 14:23:36

            Pour la démonstration : 

            Prenons une image 500x500 pixels. J'effectue une soustraction entre deux images (donc 250000 opérations). Je binarise mon image (de nouveau 250000 opérations). Je compte les pixels blanc (au maximum 250000 opérations). J'ai donc 3*250000 opération que j'arrondi à 10^6. Or 10^6<1,6*10^7. Je peut donc espérer monter à 10 FPS.

            Le capteur CMOS à l'aire sympathique. Je vais faire des recherche dans ce coin là.

            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2014 à 14:36:46

              J'effectue une soustraction entre deux images (donc 250000 opérations)

              Ton image est en niveau de gris ou en RGB ? Combien de bits par couleur ?

              Ensuite, 1 if ca se traduit par forcément en une seule instruction (idem pour d'autres instrcutions) donc ton calcul ne peut pas être aussi simple. Enfin, où sont les étapes d'acquisitions dans ton calcul ? Dans quel type de mémoire tu stockes ton image ? La RAM de l'Arduino ? Si oui je dis : Non !

              500*500 en niveau de gris (un octet) 250 000 octets par image. fois 2 pour 2 images (courant et précédente) = 500 000 octets, 500 Ko. Sur une mémoire RAM qui en fait 2kB, dommage....

              • Partager sur Facebook
              • Partager sur Twitter

              Retrouvez moi sur mon blog et ma chaine Youtube !

                19 janvier 2014 à 22:23:02

                -Les images serons évidement en N/B.

                -En code AMS un if coûte une opération "AH cmp AL"

                Idem pour la soustraction. http://www.atmel.com/images/doc0856.pdf

                -Je peut très bien charger une petite zone de mon image, traiter ce morceau, et passer au suivant. On peut aussi imaginer un traitement ligne par ligne.

                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2014 à 22:29:01

                  robinson des bois a écrit:

                  Je peut très bien charger une petite zone de mon image, traiter ce morceau, et passer au suivant. On peut aussi imaginer un traitement ligne par ligne.

                  En admettant que tu codes super optimisé pour le traitement, comment tu fais pour stocker l'image à t-1 dans 2kB de RAM ? (en sachant que 500px par 500px fait toujours 250Ko) ?

                  Qu'on soit d'accord, je veux pas te dégouter du truc, mais juste te faire réaliser que l'Arduino c'est pas la plateforme qu'il te faut pour ca... (et si c'est une question de coût, essaie de te tourner vers une raspberry pi par exemple).

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Retrouvez moi sur mon blog et ma chaine Youtube !

                    19 janvier 2014 à 22:46:29

                    void loop()
                    {
                        while(//toutes l'image traité)
                        {
                            //chargement de 1Ko de l'image échelons.
                            //chargement de 1Ko de l'image courante.
                            //traitement
                        }
                    }

                    Je pense qu'un code comme celui ci fera l'affaire. Pourquoi l'arduino ? Tout simplement parce que je suis un programmeur et que cette plateforme est très facile à prendre en main :)

                    Mon objectif est de pouvoir bidouiller des trucks dans mon coin. Donc si le traitement d'image n'est pas possible et bin tant pis. Mais je pense vraiment qu'on peut faire quelque chose avec.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 janvier 2014 à 22:52:03

                      Je reformule ma question : Entre le moment ou tu as finis de traiter ton image i et le moment où tu vas récupérer l'image i+1, tu vas stocker où l'image entière i ?

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Retrouvez moi sur mon blog et ma chaine Youtube !

                        19 janvier 2014 à 23:07:28

                        Je peut stocker mon image sur de la ROM (je rajoute un disque dure :p ). On doit bien pouvoir connecter une puce mémoire. Ou même utiliser l'entré USB pour brancher une clef (mais bon là y faut coder un driver...).
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 janvier 2014 à 23:12:16

                          robinson des bois a écrit:

                          Je peut stocker mon image sur de la ROM

                          Toujours trop petit ;) (et pour le coup tu vas flinguer ta mémoire)

                          (je rajoute un disque dure :p ). On doit bien pouvoir connecter une puce mémoire.

                          Oui, tu pourrais rajouter une mémoire externe.

                          Ou même utiliser l'entré USB pour brancher une clef (mais bon là y faut coder un driver...).

                          Non, pas d'USB Host sur l'Arduino sans shield (sous entendu tu pourras rajouter un shield)

                          Bien que certaines de ces solutions pourrait fonctionner, ton traitement va s'écrouler puisque les temps d'accès pour sauver/récupérer quoi que ce soit seront beaucoup trop long.

                          -
                          Edité par Eskimon 19 janvier 2014 à 23:12:50

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Retrouvez moi sur mon blog et ma chaine Youtube !

                            19 janvier 2014 à 23:18:06

                            Comment je l'ai dit tous à l'heure si c'est trop lent et bien tant pis. Mais je ferais des tests pour voir. Merci pour les infos :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 janvier 2014 à 0:29:44

                              Tu veux détecter un objet en faisant une soustraction entre deux images ?

                              Ca veut dire que ton image testée sera exactement pareil que l'image étalon sauf l'objet présent.

                              Faire une soustraction, c'est probablement possible à une fréquence assez faible, mais faire autre chose (de la détection) en plus c'est mort.

                              De toute façon vouloir faire un truc à la limite des capacités du microcontroleur, pourquoi pas, c'est intéressant, maintenant faut pas oublier que tu utilise le framework Arduino et je doute que tu ai été voir comment étaient codées les fonctions et voir le résultat de la compilation.

                              robinson des bois a écrit:

                              [...]

                              -En code AMS un if coûte une opération "AH cmp AL"

                              Idem pour la soustraction. http://www.atmel.com/images/doc0856.pdf

                              [...]

                               Whaaaaat ?!

                              En code AMS ? kesako ? 

                              Ensuite non un "if" en assembleur AVR / Microchip et même la plupart des assembleur ce n'est jamais qu'un CMP (Compare), c'est une opération, comme la comparaison + un "Branch if [qqch]" ([qqch] = equal to / greater than pour AVR entre autre) par rapport au résultat de l'opération précédente.

                              De plus si le résultat est faux, l'opération "branch if" coûte une instruction, si elle est vraie, elle en coûte deux (car on fait un jump vers le label du "vrai"), et il faut ajouter une instruction pour l'opération précedente (comparaison par exemple).

                              Et si tu utilise des interruptions, tu peux aussi avoir des sauvegardes de contexte à effectuer, ce qui te plombera ton compte d'instructions.

                               Enfin bref, si personne ne fait de traitement vidéo avec un Atmel 8 bits c'est bien qu'il y a une raison. 



                              -
                              Edité par zeqL 20 janvier 2014 à 0:32:12

                              • Partager sur Facebook
                              • Partager sur Twitter

                              [Arduino] Connecter une caméra

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown