Aller au contenu


Photo
- - - - -

probleme code processing + Arduino


6 réponses à ce sujet

#1 william

william

    Nouveau membre

  • Membres
  • 5 messages

Posté 12 mai 2010 - 04:10

bonjour ,

je travail sur un projet de tourelle lance projectile a detection automatique de la couleur rouge. il y a une tourelle avec une web cam dessus et deux servos pour l'axe horizontal et verticale.
le code processing detecter la couleur rouge la plus forte sur se que voi la web cam et cree un rectangle rouge dessus, le centre de se carre est decrit par Xmoy et Ymoy, on veut pouvoir dire au servo de bouger pour avoir le carre rouge au mileu de l'ecran ( la tourelle se retrouvant en face de la cible rouge) aisni de mettre Xmoy et Ymoy au milieu de l'ecran.

Le code pour detecter une couleur rouge fonctionne mais le probleme est que je ne parviens pas a envoier la position que doive adopter les servos en fonction de se que voi la webcam.

j'ai essaier de m'aider du code qui permet de bouger les servos avec la souris de l'ordi, mais sa ne fonctionne pas.
voila les code :


CODE PROCESSING

import processing.video.*;
import processing.serial.*;
Serial port;// port pour transmettre a arduino

int numPixels;
Capture video;

void setup() {
size(640, 480);
// buffer = createImage(640,480,HSB);
//image(buffer,639,0);

// détection de la webcam par defaut
video = new Capture(this, 640, 480);
numPixels = video.width * video.height;

println(Serial.list()); // List COM-ports

//select second com-port from the list
port = new Serial(this, Serial.list()[0], 19200);

}


void draw() {

if (video.available()) {
colorMode(HSB, 100, 100, 100);
//background(0,0,99);
// buffer.loadPixels();
video.read();
video.loadPixels();
image(video, 0, 0); // initialisation position video
//initialisation
float Xm=0;
float Ym=0;
float Xmoy=0;
float Ymoy=0;
float coef=0;
color noir = color (0,0,0);


// int PixCop = 0;
//Parcours tout les pixels de l'image
for (int x = 0; x < 639; x++)
{
for(int y = 0; y < 479;y++)
{
int loc = x+y*640;
color ColorPix = video.pixels[loc];

if( hue(ColorPix)>93 && saturation(ColorPix)>60 && brightness(ColorPix)>30)
{
Xm=Xm + (x*brightness(ColorPix));
Ym=Ym + (y*brightness(ColorPix));
coef = coef + brightness(ColorPix);
set(x,y,noir);
}
}
}
Xmoy = Xm / coef;
Ymoy = Ym/coef;

fill(0,100,100);
rect(Xmoy-20,Ymoy-20,40,40);


}
}




int z=-1;

if(Xmoy > 319) ;{
//Output the servo position ( from 0 to 180)
port.write("h"+z);
}

if(Xmoy < 319) ;{
port.write("h"+1);
}


//if(Xmoy > 319) valH = val-1;

//if(Xmoy < 319) valH = val+1;
//if(Ymoy > 239) valV = val-1;
//if(Ymoy > 239) valV = val+1;

}




CODE ARDUINO

#include <Servo.h> //bibliothéque pour les servomoteurs

Servo servoH; // Crée un serveur pour les déplacement Horizontal
Servo servoV; // Crée un serveur pour les déplacement Vertical

//int potpinH = 0;// analog pin for H used to connect the potentiometer
//int potpinV = 0; // analog pin used for V to connect the potentiometer

//int valH; // variable to read the value from the analog pin
//int valV; // variable to read the value from the analog pin

void setup()
{
servoH.attach(14); // attaches the servo on pin 9 to the servo object
servoV.attach(8); // attaches the servo on pin 8 to the servo object
}
void loop() {
//valH = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
//valV = analogRead(potpin);

//valH = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
//valV = map(val, 0, 1023, 0, 179);

static int v= 0;

if(Serial.available()){
char ch =Serial.read();

switch(ch) {

case 'h':
servoH.write(v);
v=0;
break;


/* servoH.write(valH); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
servoV.write(valV); // sets the servo position according to the scaled value
delay(15);
*/

}
}
}


#2 wofty

wofty

    Nouveau membre

  • Membres
  • 4 messages

Posté 13 avril 2011 - 01:40

Bonjour, je cherche aussi à faire quelque chose de similaire avec face tracking, mais je rame... :blink: Avez-vous trouvé une solution ?

#3 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris

Posté 13 avril 2011 - 02:41

Bonjour, je cherche aussi à faire quelque chose de similaire avec face tracking, mais je rame... :blink: Avez-vous trouvé une solution ?


Tu peux essayer d'utiliser OpenCV pour faire du facetraking, je l'avais utilisé à une époque : http://smartrobotics.wordpress.com/2009/06/12/face-following/


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.


#4 skyhack

skyhack

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 885 messages
  • Gender:Male
  • Location:Racourt et Flaba (08)

Posté 13 avril 2011 - 02:54

Ce serait pas un projet IMA Polytech par exemple ?

Les étudiants ici font ça entre autre ^^.

skyhack.

PS: C'est assez rare sur les forums de voir le visage d'un membre que l'on connaît depuis longtemps ici ^^
" Monsters are real. Ghosts are real too.
They live inside us and sometimes they win."
-------------Stephen King.------------------

" le fait que les extraterrestres étaient amis avec les Mayas ne signifie pas qu'ils sont nos amis ... "
-------------------------------------Stephen Hawking----------------------------------------------------

#5 wofty

wofty

    Nouveau membre

  • Membres
  • 4 messages

Posté 13 avril 2011 - 05:15

Tu peux essayer d'utiliser OpenCV pour faire du facetraking, je l'avais utilisé à une époque : http://smartrobotics.wordpress.com/2009/06/12/face-following/


IMPRESSIONNANT ton site !!! J'admire le travail que tu as fait avec tes robots. Je suis loin d'avoir ton niveau.

Ben, en faites j'utilise Processing avec une librairie Opencv, une carte Arduino et 2 servos sur une tourelle pour le tilt et pan. Malheureusement étant un peu débutant et par manque de temps (bébé oblige), je galère pour faire quelque chose de correct. Donc, si vous avez un bout de code pour Processing utlisant le face tracking et 2 servos, je prend. :rolleyes:

#6 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris

Posté 13 avril 2011 - 05:35

Ca doit faire 1 ou 2 ans que j'avais fait ce projet donc je ne me souviens plus trop de ce qu'il fallait faire, mais en gros le code c'était un truc du genre :

void detect_and_draw( IplImage* img )
{
    static CvScalar colors[] = 
    {
        {{0,0,255}},
        {{0,128,255}},
        {{0,255,255}},
        {{0,255,0}},
        {{255,128,0}},
        {{255,255,0}},
        {{255,0,0}},
        {{255,0,255}}
    };

    double scale = 1.3;
    IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
    IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
                         cvRound (img->height/scale)),
                     8, 1 );
    int i;

    cvCvtColor( img, gray, CV_BGR2GRAY );
    cvResize( gray, small_img, CV_INTER_LINEAR );
    cvEqualizeHist( small_img, small_img );
    cvClearMemStorage( storage );

    if( cascade )
    {
        double t = (double)cvGetTickCount();
        CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
                                            1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
                                            cvSize(30, 30) );
        t = (double)cvGetTickCount() - t;
        printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
        if(faces->total == 0){
             keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0);
             keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0); 
             }          
        for( i = 0; i < (faces ? faces->total : 0); i++ )
        {
            CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
            CvPoint center;
            int radius;
            center.x = cvRound((r->x + r->width*0.5)*scale);
            center.y = cvRound((r->y + r->height*0.5)*scale);
            radius = cvRound((r->width + r->height)*0.25*scale);
            cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
            
            printf("Centre x => %d \n", center.x);
            
            if( center.x < 140){
                printf("Aller à Gauche\n");
                keybd_event(VK_LEFT,0,0,0);
                Sleep(100);
                keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0);
            }
            else if(center.x > 160) {
                 printf("Aller à Droite\n");
                 keybd_event(VK_RIGHT,0,0,0);
                 Sleep(100);
                 keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0);
            }
            else {
                 keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0);
                 keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0);
            }
            
            if( center.y < 130){
                printf("Aller en Haut\n");
                keybd_event(VK_UP,0,0,0);
                Sleep(100);
                keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);
            }
            else if(center.y > 170) {
                 printf("Aller en Bas\n");
                 keybd_event(VK_DOWN,0,0,0);
                 Sleep(100);
                 keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
            }
            else {
                 keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);
                 keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
            }
        }
    }

    cvShowImage( "result", img );
    cvReleaseImage( &gray );
    cvReleaseImage( &small_img );
}

Et dans le main y avait un truc du genre :

            FILE* f = fopen( filename, "rt" );
            if( f )
            {
                char buf[1000+1];
                while( fgets( buf, 1000, f ) )
                {
                    int len = (int)strlen(buf);
                    while( len > 0 && isspace(buf[len-1]) )
                        len--;
                    buf[len] = '\0';
                    image = cvLoadImage( buf, 1 );
                    if( image )
                    {
                        detect_and_draw( image );
                        cvWaitKey(0);
                        cvReleaseImage( &image );
                    }
                }
                fclose(f);
            }

Voila, j'espere que ca aidera :D

PS : Je n'ai jamais fait de processing, donc je ne peux pas t'aider à ce niveau la.


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.


#7 wofty

wofty

    Nouveau membre

  • Membres
  • 4 messages

Posté 13 avril 2011 - 06:06

PS : Je n'ai jamais fait de processing, donc je ne peux pas t'aider à ce niveau la.


Merci, joli code que je garde de coté, mais je préfère commencer par des choses pas trop complexe et y aller crescendo. Processing a l'avantage pour moi d'être adapté pour les débutants, mais c'est parfois pas si simple. Donc, si vous avez un bout de code pour Processing utlisant le face tracking et 2 servos, je prend toujours :P .
Ceci dit, je pense que la résolution du code de William au départ du post pourrait surement m'apporter une aide précieuse. Merci



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users