|
Tout d'abord vous trouverez ici
le code complet de Haku, et là
les Dlls qui vont bien. Il s'agit aussi bien du programme sur le
robot que du programme qui fait la télécommande dans
la version Wifi (en fait c'est le même, avec un fichier de
config différent).
Vous-y trouverez :
- Une gestion de la webcam (bien sûr)
- Une gestion du port série sous windows (dur !)
- Une gestion du joystick (assez facile)
- Une gestion d'échange TCP/IP d'information client/serveur,
pour la liaison wifi.
- Le tout chapeauté par un fichier de configuration assez
simple.
Je ne vais pas trop passer de temps à l'expliquer, le code
n'est pas trop compliqué.
Par contre pour le recompiler, c'est un peu galère.
En fait ce code est basé sur un example d'une libraire :
OpenCv.
Pour info cette librairie fournit des tas de trucs pour le traitement
d'images (il y à même de la reconnaissance de visage
!). Et je me sert d'à peu près rien sur Haku,
à part le retour de l'image vidéo ;-)
Il faut avant tout repomper cette libraire et la recompiler. Il
faut aussi directX
(pour la caméra, mais aussi pour le joystick). Là
aussi c'est très lourd à recompiler !
Voici les explications fournies dans OpenCv :
/************ How to get Developer Studio understand
streams.h ************\
You need DirectShow SDK that is now a part of DirectX
SDK.
1. Download DirectX SDK from msdn.microsoft.com/directx/
(It's huge, but you can download it by parts).
If it doesn't work for you, consider HighGUI that can capture video
via VFW or MIL
2. Install it TOGETHER WITH SAMPLES.
3. Open <DirectXSDKInstallFolder>\samples\Multimedia\DirectShow\BaseClasses\baseclasses.dsw.
If there is no such file, it is that you either didn't install samples
or the path has changed, in the latter case search for streams.h
and open a workspace file (workspace files for Developer Studio
.NET have different extension) located in the same folder.
4. Build the library in both Release in Debug configurations.
5. Copy the built
libraries (in DirectX 8.x they are called strmbase.lib and strmbasd.lib)
to <DirectXSDKInstallFolder>\lib.
6. In Developer Studio add the following paths:
<DirectXSDKInstallFolder>\include
<DirectXSDKInstallFolder>\samples\Multimedia\DirectShow\BaseClasses
to the includes' search path (at Tools->Options->Directories->Include
files in case of Developer Studio 6.0)
Add
<DirectXSDKInstallFolder>\lib
to the libraries' search path (at Tools->Options->Directories->Library
files in case of Developer Studio 6.0)
NOTE: PUT THE ADDED LINES ON THE VERY TOP OF THE
LISTS, OTHERWISE YOU WILL STILL GET
COMPILER OR LINKER ERRORS. This is necessary, because Developer
Studio 6.0 includes some older DirectX headers and libs that conflict
with new DirectX SDK versions.
7. Enjoy!
\******************************************************************/
Bon courage !
Parlons un peu maintenant plus particulièrement du traitement
d'image.

En fait, c'est pas bien compliqué pour détecter les
lignes. C'est un algo "bourin" comme j'aime bien ;-)
En gros l'analyse se fait ligne par ligne sur l'image.
Pour chaque ligne il trouve le min et le max sur les couleurs noir
et blanc.
Ensuite il refait une passe, et trouve des "zone sombres"
qui sont des zones qui sont dans un certain % de noir, avec un petit
hysteresis (Elle ne sont pas representées ici).
De ces zones sombres, il tire une zone sombre continue "principale",
une par ligne. Comment il la trouve ? Et bien il part d'abord du
principe qu'elle est plutôt vers le milieu (sur la 1ere image)
puis après il se sert de la dernière position (ligne
précédente ou image précédente pour
la 1ere ligne). La zone sombre principale suivante est celle qui
est la plus près de la précédente, sachant
que l'épaisseur de la zone joue aussi un peu (j'ai réglé
des coefficients).
Le milieu de cette zone sombre principale est marqué par
les points rouges qu'on peut voir sur l'image. C'est donc la ligne
sur laquelle il fait l'asservissement ! Il y a un point rouge par
ligne de l'image.
Sinon la ligne horizontale est une ligne qui indique l'endroit à
partir duquel il ne considère plus ce qu'il y a après
comme une ligne à suivre. Comment ça marche ? En fait
c'est simple, je regarde simplement si il y a un saut de plus de
"X" pixels entre 2 points rouges sur des lignes consécutives.
Si ils sont placés sur une ligne, ils vont forcément
ne pas être trop décalés l'un par rapport à
l'autre. Par contre si ce n'est plus une ligne, les points sont
un peu placés n'importe où et il y a des sauts ->
en détectant ces sauts on sait que ce n'est plus une ligne
à suivre (bien sûr, ca ne marche pas à 100%,
mais c'est suffisamment précis pour notre besoin).
Le robot va garder un oeil (c'est le cas de le dire) sur plusieurs
lignes de l'image. En particulier si la ligne horizontale commence
à trop baisser le robot va automatiquement ralentir (pour
mieux passer le virage). Et si la ligne est vraiment trop basse,
il ralentit fortement pour ne pas rentrer dans le robot adverse
(si il le ratrape bien sûr).
Il n'y a vraiment rien de compliqué mathématiquement
là-dedans, c'est plutot du réglage (pas trop dur d'ailleur).
Le seul problème qui s'est posé (au concours et pendant
certaines démos) vient des reflets. En effet le robot peut
voir une lampe ou le soleil se refléter sur la ligne noire
... qui du coup n'est plus noire du tout ! Mais dans l'ensemble
ça marchait pas mal ;-)
|