Aller au contenu


Photo
- - - - -

Mon projet: CubDog

opencv chenilles couleur webcam

16 réponses à ce sujet

#1 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 02 juin 2017 - 02:32

Hello tous! 
 
Voici CubDog à prononcer [kyoob dog]
 
Cube car il est carré et dog car il est cencé nous suivre partout comme un toutou.. J'hésite aussi avec follower-cube pour le cube-suiveur, bref on s'en fous un peu :-D
 
00.png
 
J'ai enfin fini la partie mécanique, je vais me pencher maintenant sur la partie script, rédigé en Python.
 
01.gif
 
Il est muni d'une webcam (sous ses anciens yeux ultrason qui ne sont plus utilisés..), d'un Raspberry Pi ainsi qu'un écran de contrôle. Il a aussi 2 petits bras, qui se replient dans son ventre à la façon de Wall-E :-)  Le chassi est réalisé avec des pièces Makeblock.
 
02.png
 
Mon but à terme sera de repérer mon regard à l'aide de la cam, récupérer la moyenne de couleur contenu dans un rectangle sous ma tête (donc la couleur de mon t-shirt) puis de la suivre, le tout à l'aide d'OpenCV.
 
J'ai posté une petite vidéo, je la mettrai à jour au fils des avancées :)
 
Bonnes bidouilles à tous!


#2 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 02 juin 2017 - 03:09

Sympa, en plus il a une bonne tête :)



#3 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 02 juin 2017 - 03:41

Merci :)

J'ai une question, qu'est-ce que vous utilisez vous comme câble HDMI?

Voici le mieux que j'ai trouvé, mais super long :
https://shop.mediama...le/idp70pio0tpn

#4 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 02 juin 2017 - 03:48

ça dépend de ce que tu veux faire, si tu veux un câble juste pour la raspberry pas besoin de se ruiner et celui en lien devrai suffir,  mais si tu veux qu'il puisse aussi servir pour un home ciné essai d'en prendre un à la norme 1.4 minimum et j'éviterai les câbles rétractables.



#5 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 02 juin 2017 - 03:58

Pareil pour le rétractable, pas trop confiance, perso si c'est pour la pi, j'ai pris un entré de gamme chez carouf ^^

 

Maintenant si c'est pour lier la pi à ton écran 7", effectivement il va falloir trouver un câble court.


signature_01.png -->

 

Mon Tipeee
 


#6 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 02 juin 2017 - 04:08

Oui justement c'est pour relier la Pi à l'écran, ils sont distant de 3cm :D
Mais je ne trouve aucun câble de moins de 30cm, moi perso j'ai toujours pris des rétractables, je retire le boitier, de cette façon j'ai un cable plat et facilement pliable, par contre dans ce robot j'ai tellement peu de place qu'il va me falloir trouver une autre solution

#7 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 02 juin 2017 - 06:06

Mouais, et se faire le câble sois même, c'est chaud  ?

 

Sinon mettre un écran plus petit pour le retour d'informations souhaité (ça consommera moins), et communiquer avec PI en wifi quand tu veux mettre les mains dedans.


signature_01.png -->

 

Mon Tipeee
 


#8 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 02 juin 2017 - 06:38

C'est vraiment très cool ! as tu des tutos particuliers à conseiller pour OpenCV qui correspondent a des applications comme celle ci ?


Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#9 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 02 juin 2017 - 07:19

Super sympa !! La structure, c'est du makeblock, si je me trompe pas. C'est un package existant ou du pièces par pièces, tu t'es procuré ça où ?

Il a un petit air de wall-e avec ses bras !!

#10 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 02 juin 2017 - 08:42

Re tous,

 

Oui Path c'est du Makeblock, en fait c'est un "chassi" que j'avais fait il y a longtemps, avec un capteur ultrason. J'avais suivi un tuto, que je viens de rechercher durant presque 20min pour toi! :-D ici: http://openlab.makeblock.com/topic/56e231e9b56dce362b00749c

Le problème avec Makeblock c'est le prix!! mais je pense que c'est un investissement qui vaut la peine, car c'est une super qualité et on peut toujours le réutiliser / adapter pour faire tellement de choses :)

 

Tu m'intéresses là Oliver17 car j'avais pensé tenter de fabriquer un câble HDMI moi-même, mais ça me semble chô! Car y a combien de fils? 20 non? t'en a déjà fait un toi? Comment tu t'y es pris?

J'avais aussi pensé à un tout petit écran, mais j'aime bien l'idée qu'il remplisse tout le dos du robot, il va servir au retour d'images de la cam, afin de voir s'il détecte correctement les visages ou objets (disons pour l'instant couleurs des objets lol)

 

Sinon Yougo, je peux partager mes scripts OpenCV sans problème, mais je pense qu'il faudra quelqu'un qui connaisse mieux que moi son fonctionnement car je tatonne grave donc il doit y avoir plein d'erreurs  :crazy:

je vais les mettre dans plusieurs autres post ci-dessous, ce sera + simple



#11 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 02 juin 2017 - 09:16

Donc pour faire tourner la tête j'utilise le module PCA9685 , que je branche de cette façon:

schema.png

 

Pour installer OpenCV sur le raspberry, dans la console taper:

 sudo apt-get install python-opencv

 sudo apt-get install libopencv-dev

 

Et maintenant pour la détection du visage en Python avec OpenCV:

#!/usr/bin/python
# suivi du regard
import Adafruit_PCA9685  # Le module PCA9685 pour le ctrl des servo
import cv2  # OpenCV pour le ttt des img
#import numpy as np
import time


pwm = Adafruit_PCA9685.PCA9685()  # Initialiser en utilisant l adresse I2C par defaut (0x40)
pwm.set_pwm_freq(60)  # Set frequency to 60hz, good for servos
# Ebat max des servo:
servo_max_droit = 250
servo_max_gauche = 550
servo_max_haut = 500
servo_max_bas = 900

# on recentre les 2 servo:
pwm.set_pwm(0, 0, 400) # pour horizontal: (num_du_servo_0, 0, impulsions)
pwm.set_pwm(1, 0, 600) # pour vertical: (num_du_servo_1, 0, impulsions)
servo_actuel_horizontal = 400  # on modifiera cette variable pour deplacer la tete
servo_actuel_vertical = 600
time.sleep(1)

# Chemin du fichier .xml qui contient des modeles de visages (classifier)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

capture = cv2.VideoCapture(0) # flux de la webcam (utiliser VideoCapture(1) pour faire plusieurs flux)

while 1:
    ret, img = capture.read() # on recupere une image du flux video
    #image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # on la met en nuances de gris pour gagner du temps de traitement
    image = img # tester si c est vraiment utile de ne pas la laisser en couleur...

    newsize = (int(image.shape[1]/1.5), int(image.shape[0]/1.5)) # nouvelle taille: essayer entre 1.5 et 2
    image = cv2.resize(image, newsize) # fonction qui redimensionne pour gagner en temps de calcul

    # la fonction detectMultiScale retourne les positions de visages detecter avec les modeles contenu dans le .xml
    faces = face_cascade.detectMultiScale(image, 1.4, 3) # voir internet pour les differents parametres


    for (x,y,w,h) in faces: # on recupere les coordonnees de la tronche detectee
        cv2.rectangle(image,(x,y),(x+w,y+h),(255,7,8),2) # on dessine un rectangle
        print("X: " + str(x))
        print("Y: " + str(y))
        print("H: " + str(h) + " donc la distance")
        print("")


        # deplacements horizontaux de la tete:
        if x < 120:
            servo_actuel_horizontal = (servo_actuel_horizontal + 3)
            if servo_actuel_horizontal > servo_max_gauche:
                servo_actuel_horizontal = servo_max_gauche

        if x > 170:
            servo_actuel_horizontal = (servo_actuel_horizontal - 3)
            if servo_actuel_horizontal < servo_max_droit:
                servo_actuel_horizontal = servo_max_droit

        pwm.set_pwm(0, 0, servo_actuel_horizontal) # pour horizontal
        print("Nouvelle position du servo horizontal: " + str(servo_actuel_horizontal))


        # deplacements verticaux de la tete:
        print("Pr ctrl servo_actuel_vertical: " + str(servo_actuel_vertical))
        if y > 95:
            servo_actuel_vertical = (servo_actuel_vertical + 2)
            if servo_actuel_vertical > servo_max_bas:
                servo_actuel_vertical = servo_max_bas

        if y < 55:
            servo_actuel_vertical = (servo_actuel_vertical - 2)
            if servo_actuel_vertical < servo_max_haut:
                servo_actuel_vertical = servo_max_haut

        pwm.set_pwm(1, 0, servo_actuel_vertical) # pour vertical
        print("Nouvelle position du servo vertical: " + str(servo_actuel_vertical))


    cv2.imshow('Image capturee',image) # on affiche l image pour ctrl
    k = cv2.waitKey(30) & 0xff
    if k == 27: # si ESC on sort de la boucle
        break

capture.release()
cv2.destroyAllWindows()

Pour le suivi des couleurs (ici bleue):

#!/usr/bin/env python
# Suivi par la tete de la couleur bleue

import Adafruit_PCA9685  # Le module PCA9685 pour le ctrl des servo
import time
import cv2  # OpenCV pour le ttt des img
import numpy as np

pwm = Adafruit_PCA9685.PCA9685()  # Initialiser en utilisant l adresse I2C par defaut (0x40)
pwm.set_pwm_freq(60)  # Set frequency to 60hz, good for servos
# Ebat max des servo:
servo_max_droit = 250
servo_max_gauche = 550
servo_max_haut = 500
servo_max_bas = 900

# on recentre les 2 servo:
pwm.set_pwm(0, 0, 400) # pour horizontal: (num_du_servo_0, 0, impulsions)
pwm.set_pwm(1, 0, 600) # pour vertical: (num_du_servo_1, 0, impulsions)
servo_actuel_horizontal = 400  # on modifiera cette variable pour deplacer la tete
servo_actuel_vertical = 600
time.sleep(1)


# on extrait la position X et Y de la couleur bleue
capture = cv2.VideoCapture(0) # flux de la webcam (utiliser VideoCapture(1) pour faire plusieurs flux)

while 1:
    ret, image = capture.read() # on recupere une image du flux video
    newsize = (int(image.shape[1]/1.5), int(image.shape[0]/1.5)) # nouvelle taille: essayer entre 1.5 et 2
    image = cv2.resize(image, newsize) # fonction qui redimensionne pour gagner en temps de calcul

    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # on converti l image en HSV dans $hsv

    # on definit des seuils de couleurs bleues en HSV
    bleu_bas = np.array([110,50,50])
    bleu_haut = np.array([130,255,255])

    bleu = cv2.inRange(hsv, bleu_bas, bleu_haut) # on filtre que le bleu dans l image $hsv que l on met dans $bleu
    cv2.imshow('Ctrl vision de la couleur',bleu) # on affiche l image pour ctrl


    # on trouve le contour de la couleur
    contour = cv2.findContours(bleu.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]


    # et on calcule un cercle autour de ce contour
    centre = max(contour, key=cv2.contourArea)
    ((x, y), radius) = cv2.minEnclosingCircle(centre)


    if radius > 10: # seuil minimum avant de dessiner le cercle
        cv2.circle(image, (int(x), int(y)), int(radius), (0, 255, 255), 2)  # cercle jaune
        cv2.circle(image, (int(x), int(y)), int((radius / radius) + 1), (255, 255, 255), 2)  # point blanc
        print("Distance: " + str(radius))
        print("X: " + str(x))
        print("Y: " + str(y))
        print("")



    x = int(x)
    y = int(y)
    # deplacements horizontaux de la tete:
    if x < 150:
        servo_actuel_horizontal = (servo_actuel_horizontal + 3)
        if servo_actuel_horizontal > servo_max_gauche:
            servo_actuel_horizontal = servo_max_gauche

    if x > 300:
        servo_actuel_horizontal = (servo_actuel_horizontal - 3)
        if servo_actuel_horizontal < servo_max_droit:
            servo_actuel_horizontal = servo_max_droit

    pwm.set_pwm(0, 0, servo_actuel_horizontal) # pour horizontal
    print("Nouvelle position du servo horizontal: " + str(servo_actuel_horizontal))


    # deplacements verticaux de la tete:
    print("Pr ctrl servo_actuel_vertical: " + str(servo_actuel_vertical))
    if y > 190:
        servo_actuel_vertical = (servo_actuel_vertical + 2)
        if servo_actuel_vertical > servo_max_bas:
            servo_actuel_vertical = servo_max_bas

    if y < 80:
        servo_actuel_vertical = (servo_actuel_vertical - 2)
        if servo_actuel_vertical < servo_max_haut:
            servo_actuel_vertical = servo_max_haut

    pwm.set_pwm(1, 0, servo_actuel_vertical) # pour vertical
    print("Nouvelle position du servo vertical: " + str(servo_actuel_vertical))


    cv2.imshow('image',image)


    k = cv2.waitKey(30) & 0xff
    if k == 27: # si ESC on sort de la boucle
        break

capture.release()
cv2.destroyAllWindows()

Voilà, j'ai essayé de commenter un maximum le code, maintenant je le redis je débute donc il n'est pas très joli mon code, faut pas hésiter à le critiquer :-)

 

 

Pour les moteurs, pour l'instant j'ai fait un pont en H avec des piles AA, mais ça ne marche pas trop, ça me fait des big a'coup, faut que j'y travaille encore..  Je mets quand même le schéma:

5moteur2.png

 

Sources:

http://docs.opencv.org/3.1.0/df/d9d/tutorial_py_colorspaces.html



#12 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 03 juin 2017 - 08:03

:)

 

Ben perso pour le cable HDMI, non j'en ai jamais fais moi même, c'est pour ça que je posais la question, il doit bien y avoir une solution dans ce sens. :)


signature_01.png -->

 

Mon Tipeee
 


#13 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 03 juin 2017 - 08:15

Merci beaucoup c'est bien commenté   :)


Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#14 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 519 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 03 juin 2017 - 08:43

Voici un connecteur HDMI. (j'ai pris le premier qui passait)


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#15 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 03 juin 2017 - 03:10

Cool Melmet, j'ai commandé une prise HDMI à monter soit-même, je n'ai pas pris la pince à sertir à 300 balles, on verra ce que ça donne sans  :lol:

 

Sinon Path j'avais oublié de répondre à ta question sur où trouver les Makeblock, ici y a les revendeurs officiels:

http://www.makeblock.com/distributors

 

A++



#16 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 03 juin 2017 - 04:32

Ouais, c'est pas donné.

Merci !!



#17 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 11 juin 2017 - 09:51

Re tous :)

 

Alors j'ai bien reçue ma fiche à monter soit-même, mais sans pince à sertir c'est juste impossible :(

 

Les connecteurs sont tellement proches, j'ai toujours eu 2 voir même 3 fils qui se touchent...

 

fiche.png

 

Du coup j'ai pris un fils HDMI qui se roule, j'ai enlevé l'enrouleur, et mis le tout comme ça:

fiche2.png

C'est un fils plat, donc il est très souple et facile à installer..

 

Voilou pour les dernières infos   :bye:





Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : opencv, chenilles, couleur, webcam

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

0 members, 0 guests, 0 anonymous users