# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Lecture de disques de chronotachygraphes

## ankou29666

Bonjour

Je cherche  lire des disques de chronotachygraphes (les mouchards qui enregistrent les vitesses et les temps de conduite des chauffeurs bus et poids lourd).



Je n'ai malheureuseemnt pas encore de scanner  ma disposition, donc je ne peux pas vous fournir mieux que ce scan mauvaise qualit trouv sur le net ...

Sur ces disques, on trouve 3 enregistrements : 
*Vitesse* : le trac le plus  l'extrieur du disque ... pas besoin de faire de commentaire particulier, je pense que c'est suffisemment parlant ...*Activits* : le trac du milieu ... L'paisseur du trait permet d'enregistrer ce que fait le conducteur ... du plus pais au plus fin, on trouve conduite, travail, attente et repos ... Sur ce scan, on voit trs bien la conduite, pas trs bien le repos, visiblement y'a ni travail ni attente sur ce disque.*Distance* : le trac le plus au centre qui fait du yoyo ... pas trs visible sur ce scan ... entre les 2 sries de 2 pointills, pour ceux qui comme moi au dbut auront du mal  le trouver ... Le curseur fait un aller/retour en 10km ...

Ce qui m'intresse principalement, c'est de lire les temps d'activit des chauffeurs. Pour ce, j'avais pens  l'algo suivant :
scanner le disque en plaant une feuille de couleur dessous afin d'viter un fond blancdtecter les bords du disque (d'o l'intrt je pense d'viter le fond blanc), et liminer le fonddterminer le centre du disque avec la mthode des 3 pointsdterminer l'orientation du disque grce  la came centrale qui fait tourner le disque dans l'appareil ...affiner ventuellement l'orientation grace au gros trait pais qu'on voit  l'extrieur sur la tranche 12-24 ...procder au balayage du disque

Pour le balayage, l'ide globale s'inspire un peu du fonctionnement des scanners de disque dont disposent les entreprises, sauf que l c'est virtuel et pas rel : lire une tranche du disque, partant du centre pour aller vers le bord extrieur, puis tourner le disque d'1/1440e de tour et recommencer 1439 fois ... (24*60=1440 minutes par jour) ...
un peu le mme principe que le scanner  plat, sauf que l c'est pas le balai qui se dplace mais le disque, et que c'est pas linaire mais rotatif ...

*J'arrive donc  ma question : quelle librairie C/C++ permettrait d'effectuer la lecture de l'paisseur de ce trait ??? et quoi utiliser dans la librairie ???*

J'ai effectu qq recherches sur le sujet, mais j'arrive pas  trouver ce qui m'intresse dans les normes docs ...

Merci pour votre aide ...

----------


## pseudocode

> lire une tranche du disque, partant du centre pour aller vers le bord extrieur, puis tourner le disque d'1/1440e de tour et recommencer 1439 fois ... (24*60=1440 minutes par jour) ...
> un peu le mme principe que le scanner  plat, sauf que l c'est pas le balai qui se dplace mais le disque, et que c'est pas linaire mais rotatif ...


Pourquoi ne pas directement utiliser les coordonnes polaires ?

----------


## ankou29666

> Pourquoi ne pas directement utiliser les coordonnes polaires ?


ben j'y avait song mais je savais pas vraiment que a pouvait se faire ... quelle librairie peut faire a ?

----------


## pseudocode

> ben j'y avait song mais je savais pas vraiment que a pouvait se faire ... quelle librairie peut faire a ?


heu... pas besoin de librairie, juste des formules de conversion:

x = radius.cos(theta)
y = radius.sin(theta)

theta varie entre 0 et 2PI
radius varie entre 0 et le rayon du disque.

Dans ton cas, tu peux faire varier radius entre le rayon min/max de chaque bande qui t'intresse.

----------


## ankou29666

> heu... pas besoin de librairie, juste des formules de conversion:
> 
> x = radius.cos(theta)
> y = radius.sin(theta)
> 
> theta varie entre 0 et 2PI
> radius varie entre 0 et le rayon du disque.
> 
> Dans ton cas, tu peux faire varier radius entre le rayon min/max de chaque bande qui t'intresse.


ouaip ok, mais la bande qui m'intresse, je l'extrait comment ???

----------


## pseudocode

> ouaip ok, mais la bande qui m'intresse, je l'extrait comment ???


bah, les rayons min/max de chaque bande sont toujours les mmes. Il suffit de les mesurer une fois pour toute.

Aprs tu peux par exemple recrer des bandes rectangulaires de pixels (avec les formules de conversion inverse), pour pouvoir utiliser des bibliothques standards de traitement d'image.

----------


## ankou29666

> bah, les rayons min/max de chaque bande sont toujours les mmes. Il suffit de les mesurer une fois pour toute.
> 
> Aprs tu peux par exemple recrer des bandes rectangulaires de pixels (avec les formules de conversion inverse), pour pouvoir utiliser des bibliothques standards de traitement d'image.


ok merci de ne pas rpondre  ma question ... je m'attendais  mieux de la part d'un modrateur ...  ::king::  ::king::  ::king:: 

quelqu'un d'autre ?

----------


## pseudocode

> ok merci de ne pas rpondre  ma question ... je m'attendais  mieux de la part d'un modrateur ...


Modrateur n'est pas un synonyme de comptent.  ::aie:: 

Cependant, je me permet de faire remarquer que lorsqu'on ne trouve pas de moyen pour implmenter une solution, c'est peut-tre que la solution n'est pas la bonne.  ::roll::

----------


## ankou29666

> Modrateur n'est pas un synonyme de comptent. 
> 
> Cependant, je me permet de faire remarquer que lorsqu'on ne trouve pas de moyen pour implmenter une solution, c'est peut-tre que la solution n'est pas la bonne.


le problme c'est pas a ... dans le traitement d'image y'a deux choses : la transformation des images et l'extraction d'information ... dans les docs des diverses librairies (cf ce topic), j'ai pu trouver tout ce qui concerne la transformation, mme chose dans les tutos ... en revanche je ne trouve rien concernant l'extraction des donnes de l'image ...

En gros ce que je cherche, c'est une librairie C++ qui me permette de lire l'image depuis un fichier, de stocker cette image dans un objet, d'y faire les prtraitements que j'ai mentionn plus haut, et d'extraire des sries de pixels dans lesquels je pourrait lire ... a j'ai trouv dans aucune doc ... et c'est pas faute d'avoir cherch ... je suis pas expert en traitement d'image, mais en "vieux" routard du C++, je m'attends pas  ce que la matrice de pixels soit publique ... il me faut extraire une portion du disque, et c'est ce que je cherche  faire ... et j'ai pas trouv a dans les docs ...

l'ide de faire tourner le disque plutt que de faire tourner le balai, c'est parce qu'en gnral, on peut "copier" une zone rectangulaire dfinie par (x1,y1),(x1,y2),(x2,y2),(x2,y1) ... 2 abcisses, 2 ordonnes pour 4 points ... avec cette solution, si je veux lire une ligne d'un pixel de large, je ne peux que lire en horizontale ou verticale ...
Cependant si tu connais quelque chose qui me permette de faire cette extraction en polaire comme tu le suggrais, je suis preneur, a serait sans doute nettement plus rapide de lire selon un angle dtermin, plutt que de faire 1440 rotations d'une image qui ne sera pas des plus lgres (mon disque de ~12cm de diamtre scann en 300dpi fera au bas mot 1400px de diamtre, et les 300dpi, c'est un minimum, il sera sans doute prfrable de grimper au del) ...

----------


## pseudocode

> j'ai pu trouver tout ce qui concerne la transformation, mme chose dans les tutos ... en revanche je ne trouve rien concernant l'extraction des donnes de l'image ...


Bah, c'est ce que je te disais dans mon post : tu peux par exemple recrer des bandes rectangulaires de pixels avec les formules de conversion polaire/rectangulaire:



```

```

Bande 1:


Bande 2:


Bande 3:

----------


## ankou29666

> Bah, c'est ce que je te disais dans mon post : tu peux par exemple recrer des bandes rectangulaires de pixels avec les formules de conversion polaire/rectangulaire:


recrer les bandes rectangulaires est intressant pour la visualisation  l'oeil, mais en pratique juste une tape inutile ... plutt que de linariser puis lire dans l'image linarise, autant lire directement dans l'image originale ...

Ce qui m'intresse c'est plutt de ressortir un tableau du genre :
Dbut de service : 8h00
Conduite : 08h00-08h30
Travail : 08h30-09h30
Conduite : 09h30-12h00
Repos : 12h00-12h45
Conduite : 12h45-13h30
Attente : 13h30-14h00
Travail : 14h00-16h00
Conduite : 16h00-18h00
Fin de service : 18h00

le tout dans un joli Array<T> ... et que les valeurs que je balance ici n'ont rien  voir avec le disque qui figure dans mon premier post ...

j'ai pig le principe de ce que tu proposes ... visiblement en java y'a pas besoin de grand chose pour faire a, sauf que moi je travaille pas en java, mais en C++, et sans utiliser une librairie je vois pas trop comment y arriver ... et j'ai pas trouv les trucs intressant dans les diverses docs que j'ai pu consulter ...

ou alors si tu pouvais refaire la mme chose en C++ mais en postant la *TOTALITE* de ton code ... j'ai jamais fait de java mais le fait que t'ai pas dclar la variable imageoriginale m'incite  supposer que tu n'as post qu'une partie du code ... et que mme si je voulais faire a en java, c'est la partie la plus intressante du code qui manque ...

----------


## pseudocode

> recrer les bandes rectangulaires est intressant pour la visualisation  l'oeil, mais en pratique juste une tape inutile ... plutt que de linariser puis lire dans l'image linarise, autant lire directement dans l'image originale ...


L'image en coordonnes cartsienne permet de pouvoir utiliser tout un tas de filtres standards, en particuliers ceux qui vont utiliser des calculs de drives. En coordonnes polaires, les calculs de drives deviennent vite fastidieux.





> Ce qui m'intresse c'est plutt de ressortir un tableau du genre  (...) le tout dans un joli Array<T> ...


Oui, je me doute. L'analyse de la bande #2 ne devrait pas tre trop complique. Voila l'histogramme des projections de la bande #2 que j'ai extrait ci-avant (dcale pour commencer a 0h00 et finir  23h59, et gradue en 1/4 heure):



Le premier pic  lieu vers 6h30 et le dernier vers 17h30.  Il faudrait un exemple avec toutes les "paisseurs" de traits pour se faire une ide du seuil de dtection des activits.




> visiblement en java y'a pas besoin de grand chose pour faire a, sauf que moi je travaille pas en java, mais en C++, et sans utiliser une librairie je vois pas trop comment y arriver ... et j'ai pas trouv les trucs intressant dans les diverses docs que j'ai pu consulter ...


En java aussi on utilise une librairie, mais elle est incluse en standard. En C++ c'est  toi de voir la librairie que tu prfres. Les 2 librairies les plus courante sont surement OpenCV et Cimg, mais il y en a d'autre: bibliothques de traitement et d'analyse d'images.

----------


## ankou29666

> L'image en coordonnes cartsienne permet de pouvoir utiliser tout un tas de filtres standards, en particuliers ceux qui vont utiliser des calculs de drives. En coordonnes polaires, les calculs de drives deviennent vite fastidieux.


ce qui m'importe c'est les temps d'activits, et uniquement les temps d'activit ... donc les filtres on s'en fout pas mal vu qu'on s'en fout pas mal de la vitesse ... d'ailleurs celle-ci n'apparait plus avec les nouveaux chronos numriques ... on ne voit plus que les excs de vitesse ...




> En java aussi on utilise une librairie, mais elle est incluse en standard. En C++ c'est  toi de voir la librairie que tu prfres. Les 2 librairies les plus courante sont surement OpenCV et Cimg, mais il y en a d'autre: bibliothques de traitement et d'analyse d'images.


Waaaouh a y'est on rentre enfin dans le vif du sujet  ::king::  ::king::  ::king:: 

J'ai dj pass des heures  cumer les documentations des diffrentes librairies (magick++, OpenCV, Cimg), mais je ne suis toujours pas parvenu  trouver comment on extrait une srie de pixels d'une image donne ... 

Donc quelqu'un pourrait-il me dire comment faire pour extraire une srie de pixels  des coordonnes donnes d'une image donne en utilisant par exemple magick++, OpenCV, Cimg ou autre ??? Dans les docs je trouve tout, sauf a ...

----------


## ankou29666

Bon un collgue vient de m'expliquer ce qu'il faut faire avec Magick : 
- d'abord crer un objet Image
- faire le prdcoupage que j'avais mentionn au dpart

et soit ta mthode  savoir :
copier l'image dcoupe dans un *Pixels et tailler directement dans la matrice ...

soit la mienne du dpart :
copier un bloc fixe d'un pixel de large dans un *Pixels et faire tourner l'image ... mais cette mthode a l'inconvnient de retourner de nombreuses fois une image de grande dimentions, donc a va pas tre rapide en fait ...

----------


## pseudocode

> Waaaouh a y'est on rentre enfin dans le vif du sujet


Tu veux dire que toute la prsentation de ton problme de chronotachygraphe se rsume  "comment connaitre les valeurs des pixel d'une image en C++" ?  :8O: 

Ah bah c'est sr que j'ai du faire un peu de hors sujet !  ::P:

----------


## nicolas66

Etonnant car CImg est bien document et de nombreux exemples sont donns sur le site officiel. Si tu ne t'y connais pas trop en C/C++ et que tu souhaites juste charger / sauvegarder une image, alors pourquoi ne pas opter dans un premier temps, pour un simple loader de PPM / JPG ?

----------


## ankou29666

> Etonnant car CImg est bien document et de nombreux exemples sont donns sur le site officiel. Si tu ne t'y connais pas trop en C/C++ et que tu souhaites juste charger / sauvegarder une image, alors pourquoi ne pas opter dans un premier temps, pour un simple loader de PPM / JPG ?


la documentation est trs gnreuse (je parle de son volume) et c'est prcisment ce qui fait que quand on connait pas la lib, on passe des heures  chercher  chercher la fameuse aiguille dans l'immense meule de foin ... m'est arriv la mme chose avec Qt ... Pour ce qui est du C++, t'inquite pas je connais j'ai des annes de pratique derrire moi ... c'est en traitement d'image que je m'y connais pas trop ...




> Tu veux dire que toute la prsentation de ton problme de chronotachygraphe se rsume  "comment connaitre les valeurs des pixel d'une image en C++" ? 
> 
> Ah bah c'est sr que j'ai du faire un peu de hors sujet !


nan a se rsume pas  a mais c'tait le point de dpart ... d'ailleurs je crois que j'ai cliqu un peu vite sur rsolu moi ...

----------

