dimarts, 26 de juliol del 2011

Si els cotxes els dissenyessim els informàtics

Una empresa d'automòbils vol dotar als seus vehicles d'un sistema automàtic d'encesa de llums quan les circumstàncies ambientals així ho requereixin.

L'informàtic aplica la enginyeria informàtica que ha aprés. Decideix fer la fase d'anàlisi. Aquí no hi ha usuari així que passem directament a la normativa legal vigent:

ARTÍCULO 100. Alumbrado de largo alcance o carretera


1. Todo vehículo equipado con luz de largo alcance o carretera que circule a más de 40 kilómetros por hora, entre el ocaso y la salida del sol, fuera de poblado, por vías insuficientemente iluminadas ....


... 3. Se entiende por vía insuficientemente iluminada aquella en la que, con vista normal, en algún punto de su calzada, no pueda leerse la placa de matricula a 10 metros o no se distinga un vehículo pintado de oscuro a 50 metros de distancia.

Ja està clar:

While clauEnContacte() {
   bool noLlegeixPlaca = comprovaPlacaCotxeDavant( 10 );
   bool noVeigVehicleFosc = ! hiHaVehicleFosc( 50 );
   cotxe.llumsEncessos = noLlegeixPlaca || noVeigVehicleFoscA50metres;
}

L'informàtic aplicant la seva lògica informàtica, decideix prescindir de la segona condició, per què? Si ets informàtic ja ho sabràs i si no ho ets t'ho explico: perquè no pot discernir entre que el vehicle no hi sigui o no el vegi (i per tant a de portar els llums encesos a no ser que hi hagi un vehicle fosc a menys de 50 metres). Com veieu també ha decidit parametritzar els metres (10 i 50) per si canvia la normativa.


While clauEnContacte() {
   bool noLlegeixPlaca = comprovaPlacaCotxeDavant(10);
   cotxe.llumsEncessos = noLlegeixPlaca;
}

Llavors decideix que s'ha d'esforçar més en la primera condició: ha ce comprovar si realment aconsegueix llegir [ al menys una matrícula | totes les matricules ] dels cotxes a menys de 10 metres:

bool comprovaPlacaCotxeDavant( int metres, bool comprovaTotsElsCotxes )

L'informàtic anota la necessitats mínimes de programari i maquinari:
* Linux
* Pentium IV amb 2 gigas de RAM
* Motion (per fer la foto de les matrícules)
* gcc (Compilador de C)
* OpenCV

La idea és la següent:
El motion captura una imatge d'alguna cosa que es mogui, un procés escrit amb C aïlla els cotxes i les matrícules gràcies a la llibreria OpenCV (http://blog.damiles.com/2008/11/basic-ocr-in-opencv/). Amb aquesta mateixa llibreria podem saber la distància del cotxe per la mida de les lletres de la matrícula.

Motion ---> Imatge ---> OpenCV ---> matricula.txt

L'informàtic se n'adona que el procés triga una mica així que decideix fer-lo asíncron:

//Prototipus
void callbackMatricula( bool noLlegeixPlaca );
...


while clauEnContacte() {
   comprovaPlacaCotxeDavant( callbackMatricula );
}


void callbackMatricula( bool noLlegeixPlaca ) {
   cotxe.llumsEncessos = noLlegeixPlaca;
}

Per últim l'informàtic se n'adona que està sempre donant per bona la lectura de l'OCR. Llavors amplia les especificacions de maquinari i programari:
* Modem i targeta 3g.
* Oracle 11g.

Crea un servi de captchas on són els propis usuaris Internet qui validen les matrícules dels cotxes. Per tant, a cada lectura li posa un Id i quan rep la lectura de l'OCR la compara amb la lectura del Captcha.

L'informàtic crea els serveis Web necessaris per pujar matrícula i comprovar matrícula.
L'informàtic amplia l'algorisme:


void comprovaPlacaCotxeDavant( void *callbackMatricula ) {
  foto = recull_foto_motion();
  GUID id = system.GUID.newGuid();
  strMatricula = openCV_matricula( foto );


  oracle( "insert into matricules( id, resultatCatcha, resultatOCR) values ('%1',Null,'%2')", id, strMatricula );
  pujaMatriculaCatcha( id, matricula, callbackMatriculaCatcha );
}


void callbackMatriculaCatcha( int id, strMatricula ) {
  recorset = Oracle( "Select * from matricules where id='%1' and resultatOCR='%2'", id, strMatricula);
  callbackMatricula( recorset == Nil );
}
Conclusió: No falleu els catches o provocareu un accident per enlluernament.

Cap comentari:

Publica un comentari a l'entrada