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

Autres IDE Pascal Discussion :

[Scar-Divi] Détection de groupe de couleurs


Sujet :

Autres IDE Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut [Scar-Divi] Détection de groupe de couleurs
    Bonjour,
    voila j'ai un carré de 256 sur 256 et dedans un nombre x de carrés de 4 pixels (2 sur 2) tous de la même couleur.
    Je me demandais comment faire pour récupérer le nombre de fois que ce groupe apparaît ainsi que les coordonnées du pixel supérieur gauche de chaque pixel sachant que parfois les groupes peuvent se superposés et que je n'ai qu'une vue en 2D.
    Merci d'avance.
    Configuration: Scar-divi / Pascal

  2. #2
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut Pseudo-code Groupe de couleurs
    Bonjour,

    Tu cherches si j'ai bien compris à détecter les blocs de 4 pixels, de couleur uniforme, présents dans un tableau carré, d'arête égale à 256, visible sur l'écran graphique.

    La fonction GetPixel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function GetPixel(u, v: Integer): Word;
    renvoyant le numéro de la couleur actuelle du point de coordonnées (u, v), te donne accès aux quatre indices relatifs au bloc dont le coin supérieur gauche admet pour coordonnées (x, y):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     h:= GetPixel(x, y);
     i:= GetPixel(x, y+1);
     j:= GetPixel(x+1, y);
     k:= GetPixel(x+1, y+1);
    Le test d'uniformité de couleur est donné au choix par l'un des algorithmes simples suivants (il y en a bien d'autres):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Test1:= ((h=i) AND ((h=j) AND (h=k)));
     
     s:= Abs(i - h); Inc(s, Abs(j - h)); Inc(s, Abs(k - h)); Test2:= (s=0);
     
     s:= h; 
     IF (h=i) THEN Inc(s, 50); IF (h=j) THEN Inc(s, 50);
     IF (h=k) THEN Inc(s, 50); Test3:= (s>149);
    Un inventaire méthodique te permet de repérer tous les blocs, de les dénombrer et de mémoriser les coordonnées du coin s.g., et même la couleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Nb:= 0;
     FOR x:= 0 TO 254 DO
       FOR y:= 0 TO 254 DO
         IF Test(x, y, h) THEN BEGIN
                                 Inc(Nb); WriteLn(Fichier, Nb:8, x:5, y:5, h:4)
                               END;
    La dernière instruction <WriteLn> (citée de mémoire) doit sans doute être complétée, afin de conduire à une ligne lisible.
    La variable (Nb) peut être de type Word, puisqu'elle est au plus égale à 2552 = 65025 .

    Si on la déclare comme liste de 16 éléments tous initialisés à zéro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Nb: ARRAY[0..15] OF Word; 
    FOR h:= 0 TO 15 DO Nb[h]:= 0;
    un décompte séparé sur les 16 couleurs devient possible en introduisant la nouvelle instruction:

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut
    Tiens, salut voisin (de forum)

    Juste une microscopique question :
    Citation Envoyé par wiwaxia Voir le message
    Un inventaire méthodique te permet de repérer tous les blocs, de les dénombrer et de mémoriser les coordonnées du coin s.g., et même la couleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Nb:= 0;
     FOR x:= 0 TO 254 DO
       FOR y:= 0 TO 254 DO
         IF Test(x, y, h) THEN BEGIN
                                 Inc(Nb); WriteLn(Fichier, Nb:8, x:5, y:5, h:4)
                               END;
    Pourquoi 0 TO 254 DO et pas 0 TO 255 DO puisqu'on a 256 possibilités ?
    Merci et à l'année prochaine,

  4. #4
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pourquoi 0 TO 254 DO et pas 0 TO 255 DO puisqu'on a 256 possibilités ?
    Parce que le bloc dont le coin supérieur gauche se situe en (x, y) comporte 3 pixels sur la colonne à droite et/ou la ligne en-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     h:= GetPixel(x, y);
     i:= GetPixel(x, y+1);
     j:= GetPixel(x+1, y);
     k:= GetPixel(x+1, y+1);
    Dans un tableau déclaré ARRAY[0..(m-1), 0..(m-1)] OF Element et comportant (m2) termes, il n'y a que (m - 1)2 blocs, dont l'énumération résulte de 2 boucles imbriquées sur [0..(m-2)].

    Bon réveillon à tous !

  5. #5
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Bonjour,

    Tu cherches si j'ai bien compris à détecter les blocs de 4 pixels, de couleur uniforme, présents dans un tableau carré, d'arête égale à 256, visible sur l'écran graphique.

    La fonction GetPixel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function GetPixel(u, v: Integer): Word;
    renvoyant le numéro de la couleur actuelle du point de coordonnées (u, v), te donne accès aux quatre indices relatifs au bloc dont le coin supérieur gauche admet pour coordonnées (x, y):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     h:= GetPixel(x, y);
     i:= GetPixel(x, y+1);
     j:= GetPixel(x+1, y);
     k:= GetPixel(x+1, y+1);
    Le test d'uniformité de couleur est donné au choix par l'un des algorithmes simples suivants (il y en a bien d'autres):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Test1:= ((h=i) AND ((h=j) AND (h=k)));
     
     s:= Abs(i - h); Inc(s, Abs(j - h)); Inc(s, Abs(k - h)); Test2:= (s=0);
     
     s:= h; 
     IF (h=i) THEN Inc(s, 50); IF (h=j) THEN Inc(s, 50);
     IF (h=k) THEN Inc(s, 50); Test3:= (s>149);
    Un inventaire méthodique te permet de repérer tous les blocs, de les dénombrer et de mémoriser les coordonnées du coin s.g., et même la couleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Nb:= 0;
     FOR x:= 0 TO 254 DO
       FOR y:= 0 TO 254 DO
         IF Test(x, y, h) THEN BEGIN
                                 Inc(Nb); WriteLn(Fichier, Nb:8, x:5, y:5, h:4)
                               END;
    La dernière instruction <WriteLn> (citée de mémoire) doit sans doute être complétée, afin de conduire à une ligne lisible.
    La variable (Nb) peut être de type Word, puisqu'elle est au plus égale à 2552 = 65025 .

    Si on la déclare comme liste de 16 éléments tous initialisés à zéro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Nb: ARRAY[0..15] OF Word; 
    FOR h:= 0 TO 15 DO Nb[h]:= 0;
    un décompte séparé sur les 16 couleurs devient possible en introduisant la nouvelle instruction:
    tout d'abord merci de votre aide,
    Oui effectivement j'ai donc un tableau avec un background et je cherche a détecter des bloques de couleur et tout ces bloques on la même couleur.
    Le truc c'est que j'emploie scar-divi qui est un compilateur qui permette de gérer plus facilement la partie détection de l'écran,... mais qui na pas les fonction prédéfinies de pascal il en à d'autres qui sont tout aussi utiles même parfois plus.
    j'avais déjà essayé de détecter toutes ces couleurs grace au code suivant (j'ai fais un bloque de 90 sur 90 pour que ce soit plus petit)

    Nom : test.png
Affichages : 430
Taille : 399 octets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    program New;
    var 
      Points : TPointArray;
      Idx, Len : Integer;
      P : TPoint;
     
    begin
      if FindColorEx(Points, 1721408, 0, 0, 90, 90) then // retourne un tableau contenant toutes les coordonnées détectée de la couleur
      begin
        Len := Length(Points);
        for idx := 0 to Len - 1 do
        begin
          P := Points[Idx];
          WriteLn(IntToStr(P.X) + ', ' + IntToStr(P.Y));
          Inc(P.X);//j'incrémente pour exclure le x+1 des points
          //Pas trop d'idée pour exclude le y+1 de chaque point
         // ainsi que le x+1, y+1 
        end;
      end;
    end.
    mais le problème étant qu'il me retourne les coordonnées du haut de chaque bloque ainsi qu du bas évidement et je ne sais pas comment exclure la partie basse de chaque bloque.
    J'ai d'abord pensé à incrémenter aussi a chaque fois l'Y mais après me suis fais la réflexion qu'il n'irait jamais à la fin de la ligne alrs quand il en trouverait 1



    Ajout
    devrais-je peut être faire une deuxième boucle ou j'enregistre les point déjà trouvé dans le tableau le parcourir pour comparer avec le point actuel? Car je n'ai pas trop d'autre idée

    Rectification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Inc(P.X);//j'incrémente pour exclure le x+1 des points
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Inc(Idx);//j'incrémente pour exclure le x+1 des points

  6. #6
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut Pseudo-code Groupe de couleurs
    Intéressant, ce compilateur qui utilise le langage Pascal ... mais seul un utilisateur aguerri pourra te fournir une réponse complète.
    Quelques remarques, simplement, après lecture du texte:

    1°) Quelles sont les dimensions du tableau proposé ? 90×90 ou 91×91 ? Car j'ai l'impression d'informations contradictoires:
    ... j'ai fait un bloc de 90 sur 90 pour que ce soit plus petit ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ... if FindColorEx(Points, 1721408, 0, 0, 90, 90) then ...
    2°) Quelle est la valeur de l'entier (Len) ? 90 ou 902 , 91 ou 912 , ou une valeur plus faible ? Je n'ai pas compris quelle est la boucle décrite - on n'en voit d'ailleurs qu'une seule, ce qui suppose un parcours de tous les éléments d'un tableau unidimensionnel (*):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for idx := 0 to Len - 1 do
        begin
          P := Points[Idx];
          WriteLn(IntToStr(P.X) + ', ' + IntToStr(P.Y));
          Inc(P.X); 
        end
    (*) j'aurais dû y penser, (Len) est la longueur de la liste.
    Les instructions semblent correspondre à la copie des coordonnées de tous les points listés - un couple (P.X, P.Y) par ligne; ce qui suppose que la sélection des blocs monochromes de 4 pixels a été faite dès le départ ... ou dans un autre programme (ou une autre macro). De quel ensemble de pixels est-tu parti ? Du tableau nommé Points, sans doute ... Mais qu'y a-t-il dans chacun de ses éléments: les coordonnées (x, y), et la couleur, sous forme de triplet (r, v, b) ?

    3°) On en vient à ce qui aurait dû être posé en premier lieu: à quoi correspond la fonction booléenne FindColorEx(...), que représentent ses arguments (notamment les deux premiers: (Points, 1721408, ... ) .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ... if FindColorEx(Points, 1721408, 0, 0, 90, 90) then ...
    Après quelques explications, on pourrait peut-être ébaucher un algorithme ...
    Avec un peu de chance, ton travail de traduction restera assez limité.

  7. #7
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Intéressant, ce compilateur qui utilise le langage Pascal ... mais seul un utilisateur aguerri pourra te fournir une réponse complète.
    Quelques remarques, simplement, après lecture du texte:

    1°) Quelles sont les dimensions du tableau proposé ? 90×90 ou 91×91 ? Car j'ai l'impression d'informations contradictoires:
    effectivement je me suis trompé alrs qu'on venaient d'en parler juste avant

  8. #8
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    2°) Quelle est la valeur de l'entier (Len) ? 90 ou 902 , 91 ou 912 , ou une valeur plus faible ? Je n'ai pas compris quelle est la boucle décrite - on n'en voit d'ailleurs qu'une seule, ce qui suppose un parcours de tous les éléments d'un tableau unidimensionnel (*):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for idx := 0 to Len - 1 do
        begin
          P := Points[Idx];
          WriteLn(IntToStr(P.X) + ', ' + IntToStr(P.Y));
          Inc(P.X); 
        end
    (*) j'aurais dû y penser, (Len) est la longueur de la liste.
    Les instructions semblent correspondre à la copie des coordonnées de tous les points listés - un couple (P.X, P.Y) par ligne; ce qui suppose que la sélection des blocs monochromes de 4 pixels a été faite dès le départ ... ou dans un autre programme (ou une autre macro). De quel ensemble de pixels est-tu parti ?
    LEN retourne 16 dans ce cas si car il y a 16 pixels de la mm couleur

  9. #9
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    3°) On en vient à ce qui aurait dû être posé en premier lieu: à quoi correspond la fonction booléenne FindColorEx(...), que représentent ses arguments (notamment les deux premiers: (Points, 1721408, ... ) .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ... if FindColorEx(Points, 1721408, 0, 0, 90, 90) then ...
    Après quelques explications, on pourrait peut-être ébaucher un algorithme ...
    Avec un peu de chance, ton travail de traduction restera assez limité.
    et oui effectivement j'ai oublié de remettre les types demandés par la fonction (pointarray, color, xs, ys, xe, ye):boolean

  10. #10
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    c'est vrais que j'aurais du rajouter des commentaire :p
    donc en claire:
    - FindColorEx retourne un boolean si il trouve des points
    FindColorEx(out Points: TPointArray, Color: LongInt, Xs:LongIng, Ys:LongIng, Xe:LongIng, Ye:LongIng): boolean;

    -Len
    taille du tableau (nombre de fois que le pixel à été trouvé)

    -P := Points[Idx];
    les coordonnées de chaque point

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Détection du changement de couleur de remplissage
    Par kev59600 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/04/2016, 17h15
  2. Réponses: 7
    Dernier message: 08/07/2014, 12h21
  3. Détection de tache de couleur et centre de gravité
    Par soybenito dans le forum OpenCV
    Réponses: 3
    Dernier message: 30/05/2009, 10h57
  4. Détection des tons "chair" (couleur "chair")
    Par guiyomh dans le forum C
    Réponses: 1
    Dernier message: 08/06/2008, 15h58
  5. détection zone pour changer couleur
    Par petunia28 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/05/2006, 17h13

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