Full text
TREBALL FINAL DE GRAU LECTURA REMOTA DE COMPTADORS ANALÒGICS GRAU EN ENGINYERIA DE SISTEMES TIC Autor: Raül Caldera Sànchez Director: Pere Palà Schonwalder Data: 7 de juliol de 2017 Localitat: Manresa
Lectura remota de comptadors analògics Raül Caldera Sànchez AGRAÏMENTS Vull agraïr a tots els professors de l’ EMIT de l’ EPSEM, en especial al dr. Pere Palà Schonwalder, tutor d’ aquest projecte, el fet d’ haver fet possible la realització d’ aquest projecte, i a totes les persones que m’ han aconsellat o ajudat durant el seu transcurs. Pàgina 2
Lectura remota de comptadors analògics Raül Caldera Sànchez RESUM DEL PROJECTE Aquest projecte té el propòsit fer possible la lectura a distància de diferents comptadors analògics, per tal de tenir un millor control i seguiment del consum energètic, ja sigui d’ una casa, d’ una empresa, etc… i per facilitar la obtenció i posterior tractament de les dades que els comptadors ofereixen. Malgrat que avui en dia existeixen els comptadors electrònics, els quals alguns ja envien les seves lectures a una base de dades remota, complint així el propòsit d’ aquest projecte [ref. 75], pocs oferiexen encara aquest funcionalitat, i per altra banda encara és molt freqüent l’ ús de comptadors analògics. Per això, en aquest projecte es proposa un sistema capaç de proporcionar la mateixa funcionalitat per a aquests comptadors. Per tal de realitzar això, en aquest projecte s’ ha construït un prototip del sistema, que consta d’ una càmara per a prendre imatges del comptador, una Raspberry Pi que processa les imatges preses per la càmara, n’ extreu les dades desitjades i les envia a un ordinador/servidor remot que guarda aquestes dades en una base de dades, ja preparades per al seu tractament, i també ofereix la possibilitat de poder-les passar a un format que es pugui llegir amb programes com el LibreOfficeCalc. El projecte també consta del desenvolupament d’ una montura que sosté el sistema físic (càmara, Raspberry Pi, comptador) i que conté elements per tal de maximitzar l’ eficiència del sistema (miralls per a prendre imatges dels comptadors amb angles incilinats i que permeten reduïr l’ espai que ocupa el sistema, un braç articulat per a moure la càmara, la possibilitat de incloure-hi díodes LED per a iluminar el comptador a la foscor…). Pàgina 3
Lectura remota de comptadors analògics Raül Caldera Sànchez PROJECT ABSTRACT The aim of this project is to offer the possibility to obtain remote readings from different meters, in order to achieve a better control and following of the energy consumption of a household, a company… and thus make the data obtention and treatment of energy consumption easier. Despite nowadays electronic meters exist, some of which are capable of sending their reading to a remote database and therefore fulfilling the purpose of this project, few of them are able to do so, and moreover the use of analog meters is still quite frequent. Therefore, this project proposes a system capable of providing the same functionality for analog meters. In order to do so, this project shows a prototype of the system, which consists of a camara to take pictures of the counter, a Raspberry Pi that gets such images, treats them to obtain the desired data, and sends the data to a remote computer/ server, which saves the data into a database and prepares it for posterior treatment, and also offers the possibility to transform such data to a readable format for programs like LibreOffice Calc. The project also provides the development of a mount that supports the physical system (the camera, the Raspberry Pi, the energy meter), and that contains a series of elements to improve the overall efficiency of it, such as a mirror to take pictures with close angles to reduce the space needed for the system, an articulated arm that supports de camera, the possibility to include LEDs to illuminate the meter in dark spots… Pàgina 4
Lectura remota de comptadors analògics Raül Caldera Sànchez Índex 1. INTRODUCCIÓ..........................................................................................10 1.1 Objectius del projecte................................................................................................10 1.2 Finalitat del projecte...................................................................................................10 1.3 Abast del projecte......................................................................................................10 2. ANTECEDENTS........................................................................................12 2.1. Dades de partida......................................................................................................12 2.2. Estat de l’ art.............................................................................................................12 2.3. Coneixements necessaris per a la realització del projecte......................................14 3. EL SISTEMA..............................................................................................15 3.1. Descripció tècnica del sistema.................................................................................15 3.1.1. La càmara..........................................................................................................16 3.1.2. La Raspberry Pi.................................................................................................16 3.1.3. La montura........................................................................................................17 3.1.4. Codi necessari...................................................................................................20 3.2. Funcionament del sistema........................................................................................22 3.2.1. Dades que s’ han de prendre dels comptadors................................................22 3.2.2. Presa de les dades............................................................................................23 3.2.3. Tractament de les dades...................................................................................24 3.2.3.1. Processat d’ imatge del comptador de llum...............................................24 3.2.3.2. Processat d’ imatge del comptador d’ aigua..............................................30 3.2.4. Enviament de les dades....................................................................................39 3.2.4.1. El protocol MQTT i paho.mqtt....................................................................39 3.2.4.2. Estructura de pas de missatges.................................................................41 3.2.4.3. Execució i temporització de les peticions..................................................43 3.2.5 Emmagatzemament de les dades......................................................................44 4. TRACTAMENT DE LES DADES...............................................................45 4.1. Visualització de la imatge.........................................................................................45 4.2. Extracció i tractament de les dades..........................................................................45 5. LLISTAT DE COSTOS DEL PROTOTIPUS..............................................47 6. CONDICIONS PER A L’ EXECUCIÓ DEL SISTEMA................................48 6.1. Posada en marxa i correcte funcionament del sistema...........................................48 Pàgina 5
Lectura remota de comptadors analògics Raül Caldera Sànchez 6.2. Implementacions extres del sistema........................................................................48 6.2.1. Els miralls..........................................................................................................48 6.2.2. La lent................................................................................................................49 7. TESTEIG DEL SISTEMA...........................................................................50 7.1. Testejos amb el comptador de llum..........................................................................50 7.1.1. Càmara enfocant directament al comptador.....................................................50 7.1.2. Càmara enfocant al mirall.................................................................................54 7.2. Testejos amb el comptador d’ aigua.........................................................................58 7.2.1. Càmara enfocant directament al comptador.....................................................59 7.2.2. Càmara enfocant al mirall.................................................................................62 7.3. Testejos de canvi de paràmetres de la càmara........................................................66 8. CONCLUSIONS.........................................................................................68 9. BIBLIOGRAFIA.........................................................................................69 ANNEXOS.....................................................................................................75 ANNEX I. Plànols de la montura.....................................................................................75 Pàgina 6
Lectura remota de comptadors analògics Raül Caldera Sànchez Índex de figures Figura 1: Diagrama de Gantt del projecte............................................................................11 Figura 2: Passos de processat per a l' OCR, segons l’ article IoT Based Data Processing for Automated Industrial Meter Reader using Raspberry Pi................................................13 Figura 3: Passos de processat per a l' OCR, segons l’ article Optical Character Recognition System for Seven Segment Display Images of Measuring Instruments.........13 Figura 4: Passos de processat per a l' OCR, segons l’ article A Low cost Data Acquisition System From Digital Display Instruments Employing Image Processing Technique..........13 Figura 5: Esquema de funcionament general del sistema..................................................15 Figura 6: Pi Camera Noir V2.1.............................................................................................16 Figura 7: Raspberry Pi 3......................................................................................................17 Figura 8: Comptador de llum...............................................................................................23 Figura 9: Comptador d' aigua..............................................................................................23 Figura 10: Imatge del comptador de llum en format Canny................................................26 Figura 11: Imatge de les línies horitzontals trobades en el comptador de llum amb el mètode HoughLines.............................................................................................................27 Figura 12: Imatge del comptador de llum en format Canny, orientada horitzontalment......27 Figura 13: Imatge del comptador de llum amb els contorns trobats...................................28 Figura 14: Contorns filtrats del comptador de llum..............................................................28 Figura 15: Posicions dels dígits trobats...............................................................................29 Figura 16: Dígits del comptador, després d’aplicar-hi thresholding, preparats per a l’OCR .............................................................................................................................................29 Figura 17: Imatge del comptador d’ aigua en format Canny...............................................32 Figura 18: Imatge de les línies horitzontals trobades en el comptador d’ aigua amb el mètode HoughLines.............................................................................................................32 Figura 19: Imatge del comptador d’0 aigua en format Canny, orientada horitzontalment. .32 Figura 20: Imatge de les agulles del comptador d’aigua en format HSV............................33 Figura 21: Imatge de les agulles del comptador després d’aplicar la màscara..................34 Figura 22: Contorn trobat del dígit vermell del comptador d’aigua......................................34 Figura 23: Contorns trobat de les agulles del comptador d’aigua.......................................34 Figura 24: Imatge del comptador d’aigua a la zona de les agulles amb el thresholding aplicat...................................................................................................................................35 Figura 25: Imatge dels contorns de les agulles trobats.......................................................35 Figura 26: Imatge dels cercles corresponents als dials de les agulles trobats...................36 Figura 27: Representació gràfica del principi en què es basa el mètode HoughLines.......36 Pàgina 7
Lectura remota de comptadors analògics Raül Caldera Sànchez Figura 28: Esquema de criteri de detecció dels quadrants on es troben les agulles..........37 Figura 29: Esquema de criteri de detecció de l’angle les agulles.......................................38 Figura 30: Línies de les agulles detectades amb el mètode HoughLines...........................38 Figura 31: Principi de funcionament del protocol MQTT.....................................................40 Figura 32: Esquema de l’estructura del pas de missatges entre el Host i la Raspberry via MQTT...................................................................................................................................43 Figura 33: Dades de la base de dades passades a format csv..........................................46 Figura 34: Mirall colocat al suport........................................................................................49 Figura 35: Montatge del sistema amb el comptador de llum...............................................50 Figura 36: Flux d' execució de sub.py.................................................................................51 Figura 37: Flux d' execució de pub.py durant el processat del comptador de llum............51 Figura 38: Configuració de la taula Cron per al testeig.......................................................52 Figura 39: Contingut de la base de dades després del primer testeig................................52 Figura 40: Contingut de la base de dades després del segon testeig................................53 Figura 41: Extracte del fitxer electricity_data.csv................................................................54 Figura 42: Montatge del sistema amb el comptador de llum, amb la càmara enfocant el mirall.....................................................................................................................................55 Figura 43: Captura presa de la reflexió del mirall per part de la càmara, ja voltejada i orientada correctament........................................................................................................56 Figura 44: Imatge orientada hortizontalment.......................................................................56 Figura 45: Contorns filtrats corresponents als dígits...........................................................56 Figura 46: Dígits trobats a la imatge....................................................................................56 Figura 47: Contingut de la base de dades després del primer testeig amb el mirall..........57 Figura 48: Contingut de la base de dades després del segon testeig amb el mirall...........58 Figura 49: Montatge del sistema amb el comptador d' aigua..............................................59 Figura 50: Imatge del comptador presa per la càmara........................................................60 Figura 51: Flux d' execució de pub.py durant el processat del comptador d' aigua............61 Figura 52: Contingut de la base de dades després del testeig amb el comptador d' aigua .............................................................................................................................................62 Figura 53: Montatge del sistema amb el comptador d' aigua, amb la càmara enfocant el mirall.....................................................................................................................................63 Figura 54: Captura de la reflexió del mirall del comptador d' aigua,voltejada i orientada correctament........................................................................................................................64 Figura 55: Imatge orientada hortizontalment.......................................................................64 Figura 56: Dígits trobats a la imatge....................................................................................64 Pàgina 8
Lectura remota de comptadors analògics Raül Caldera Sànchez Figura 57: Dígits trobats a la imatge....................................................................................65 Figura 58: Dígit vermell després d' aplicar la màscara de color..........................................65 Figura 59: Contingut de la base de dades després de realitzar el testeig..........................66 Figura 60: Flux d' execució de pub.py durant la petició de canvi de paràmetres de la càmara.................................................................................................................................67 Figura 61: Flux d' execució de pub.py durant la petició de canvi de paràmetres de la càmara.................................................................................................................................67 Figura 62: Imatge amb els paràmetres de la càmara modificats (mostra 2).......................67 Figura 63: Imatge amb els paràmetres de la càmara modificats (mostra 1).......................67 Figura 64: Imatge amb els paràmetres de la càmara modificats (mostra 3).......................67 Pàgina 9
Lectura remota de comptadors analògics Raül Caldera Sànchez 3.1.1. La càmara La càmara utilitzada en el prototipus és la PI NOIR CAMERA V2 [ref. 5][Figura 6]. És un mòdul que s’ incorpora a la Raspberry Pi. Aquesta n’ és la segona versió, i funciona amb tots els models de Raspberry Pi. Aquesta càmara té la característica que no conté un filtre d’ infrarojos, amb la qual cosa permet veure-hi a la foscor amb una llum d’ infrarojos. Aquesta era una possibilitat inicial i per això s’ ha escollit aquesta càmara en comptes de la CAMERA MODULE V2 [ref. 6], tot i que la solució adoptada finalment ha sigut la d’ adaptar la montura per tal que pugui incorporar-hi díodes LED [ref. 67] per a la iluminació. La càmara disposa de diferents configuracions que es poden modificar al gust de l’ usuari, a través del seu mòdul de Python [ref. 7]. Per tal de facilitar-ne l’ ús i el control, en el sistema és possible modificar aquests paràmetres (resolució [ref. 22], framerate [ref. 23], saturació [ref. 27], etc …), a través de la comunicació amb protocol MQTT [ref. 29] entre la Raspberry Pi i el Servidor/Client, tal i com s’ ha mostrat anteriorment [Figura 5]. Més endavant s’ explica amb més detall com s’ utilitza aquesta funcionalitat. 3.1.2. La Raspberry Pi Una Raspberry Pi es un mini-computador low-cost que està pensat per a usos informàtics de diferents tipus. Tot i que no inclou perifèrics, està dissenyada per tal que se n’ hi puguin incorporar. No té la mateixa potència que un ordinador de taula o un portàtil, però pot realitzar-ne moltes de les funcions, amb l’ avantatge d’ oferir un baix consum i una alta portabilitat. En el prototipus del sistema s’ utilitza el model Raspberry Pi 3 Model B [ref. 8][Figura 7], ja que aquest incorpora connexió Wi- Fi (802.11n Wireless LAN), la qual cosa és necessària per a establir una connexió remota entre la part física del sistema (montura, càmara, Raspberry Pi, Comptador) i el Host. Pàgina 16 Figura 6: Pi Camera Noir V2.1
Lectura remota de comptadors analògics Raül Caldera Sànchez La Raspberry Pi [ref. 8] és el component més important del sistema, ja que abarca totes les seves facetes i està en contacte amb ambdós extrems d’ aquest, i en realitza les funcions més essencials: •Atén a les peticions del client i actua en consequència (captura de comptadors, modificació de paràmetres de la càmara). •S’ encarrega del processat d’ imatge. Processa les captures per extreure’ n la informació (processat dels dígits, de les agulles, OCR [ref. 33]). •Envia les dades de tornada al client, en funció de la petició sol·licitada. 3.1.3. La montura La montura s’ encarrega de unir tots els elements físics del sistema. Es tracta d’ un disseny imprimit amb una impresora 3D. L’ estructura de la montura es pot organitzar en dues parts: •Components aprofitables: aquests components estan dissenyats de manera que puguin ser aprofitables per a diferents tipus de comptadors. Per tant, si en algún moment es vol canviar de comptador per a prendre captures, aquests elements podran ésser els mateixos. Els components aprofitables són el suport de la Raspberry Pi [ref. 8], el suport del mirall, el suport de la lent de la càmara [ref. 5] i el braç. Pàgina 17 Figura 7: Raspberry Pi 3
Lectura remota de comptadors analògics Raül Caldera Sànchez Descripció Disseny 3D Component imprès Component del braç articulat Suports del mirall Suports de la lent de la càmara Suport de la Raspberry Pi •Components específics: són els components que suporten el propi comptador. Com que cada comptador té unes mides i formes diferents, han de tenir un suport propi. Pàgina 18
Lectura remota de comptadors analògics Raül Caldera Sànchez Descripció Disseny 3D Component imprès Suport central del comptador d’ aigua Suport central del comptador de llum La montura s’ ha dissenyat tenint en compte els següents aspectes: •Que ocupi el mínim espai possible, per tal de potenciar la seva eficiència i fer el sistema el menys invasiu possible. •Que pugui adaptar-se a l’ entorn: en entorns tancats o molt petits, potser no és possible situar la càmara just davant del comptador. Per això la montura incorpora un braç articulat i un suport per a un mirall per tal de poder moure el suport de la Raspberry-càmara i minimitzar encara més l’ espai que ocupa la montura. En aquests casos la càmara prendrà imatges del reflex del mirall que permetrà visualitzar la informació del comptador i processar-la amb èxit. •Un altre aspecte que s’ ha tingut en compte en aquest àmbit és la possiblitat de incloure leds per tal de iluminar comptadors en zones fosques, de nit … . La montura està pensada per a incorporar fins a 4 leds. Pàgina 19
Lectura remota de comptadors analògics Raül Caldera Sànchez 3.1.4. Codi necessari En el sistema, hi ha diferents components els quals han de ser programats per tal de realitzar diverses tasques, com prendre imatges, fer el processat de la imatge, encarregar-se de la rebuda de peticions i transmissió de les dades… A continuació es mostra una llista dels llenguatges de programació i les llibreries que s’ han utilitzat: •Les llibreries més rellevants de Python [ref. 9] que s’ han utilitzat són les següents: •math, per a realitzar càlculs per al processat de les imatges [ref. 10]. •time, per a obtenir la data exacta de les captures [ref. 11]. •cv2, la qual és la llibreria de Python de OpenCV [ref. 12]. Amb aquesta llibreria s’ han utilitzat les funcions que ofereix per tal de fer tot el processat de les imatges. •PIL, una altra llibreria de tractament d’ imatges, com a eina complementària de la llibreria cv2 [ref. 13]. •pytesseract, la llibreria de Python de tesseract [ref. 14], la qual s’ utilitza per a fer el OCR [ref. 33]. •numpy, per al tractament d’ arrays de dades durant el processat de les imatges [ref. 15]. •picamera, el mòdul de Python per a configurar la Pi Camera [ref. 7]. •paho-mqtt (mosquitto), per a la comunicació de missatges entre la Raspberry Pi [ref. 8] i el Host via protocol MQTT [ref 17]. •sqlite3 per al tractament de la base de dades [ref. 18]. •Per a l’ execució de processos temporitzats, s’ utilitza Cron [ref. 19]. •Per al disseny 3D de la montura, s’ ha utilitzat OpenSCAD [ref. 20]. •Per a la base de dades, s’ ha utilitzat SQLite [ref. 21]. Pàgina 20
Lectura remota de comptadors analògics Raül Caldera Sànchez Amb l’ ús de les llibreries que s’ han mencionat anteriorment, s’ han implementat els següents mòduls de Python i altres scripts, que conformen la part de software del sistema: •app.bd: La base de dades. •images.sql: fitxer que marca l’ estructura de la base de dades i serveix per a inicialitzarla. •db_operations.py: mòdul de Python que ofereix funcions per a realitzar operacions sobre la base de dades. •exec1.sh, exec2.sh, exec3.sh: scripts de shell per a executar diferents peticions sobre el protocol de pas de missatges entre el Host i la Raspberry Pi [ref. 8]. •electricity_to_csv.sh, water_to_csv.sh: scripts de shell per a executar operacions sobre la base de dades i passar el seu contingut a un fixer de format csv. •sub.py: mòdul de Python que actua com a client (subscriptor) del protocol de pas de missatges a la màquina Host. •pub.py: mòdul de Python que actua com a client (publicador) del protocol de pas de missatges a la Raspberry Pi [ref. 8]. •camera_operations.py: mòdul de Python que s’ usa per a realitzar operacions sobre la càmara. •OCR_processing.py: mòdul de Python que implementa les funcions que s’ encarreguen de realitzar el processat d’ imatge dels dígits del comptador de llum. •OCR_processing_water.py: mòdul de Python que implementa les funcions que s’ encarreguen de realitzar el processat d’ imatge dels dígits del comptador d’ aigua. •needle_procesing_water: mòdul de Python que implementa les funcions que s’ encarreguen de realitzar el processat d’ imatge de les agulles del comptador d’ aigua. •full_electricity_processing.py: mòdul de Python que realitza tot el processat necessari del comptador de llum. Pàgina 21
Lectura remota de comptadors analògics Raül Caldera Sànchez •full_water_processing.py: mòdul de Python que realitza tot el processat necessari del comptador de d’ aigua. •electricity_support.scad: script de OpenSCAD [ref. 20] on s’ ha realitzat el disseny de la montura del comptador de llum. •water_support.scad: script de OpenSCAD [ref. 20] on s’ ha realitzat el disseny de la montura del comptador d’ aigua. •rasp_support.scad: script de OpenSCAD [ref. 20] on s’ ha realitzat el disseny de la montura del suport de la Raspberry Pi i de la lent. En els pròxims apartats s’ entrarà amb més detall el paper que realitzen i el funcionament d’ aquests fitxers. 3.2. Funcionament del sistema En aquest apartat s’ explicarà amb detall com funciona el sistema, com es realitza el processat de les imatges i com funciona el protocol de pas de missatges. 3.2.1. Dades que s’ han de prendre dels comptadors Per tal de fer el seguiment remot dels comptadors, s’ han de prendre dos tipus de dades d’ aquests. Per una banda, s’ ha de prendre la informació sobre el consum que ofereix el comptador en un moment determinat, i per una altra s’ ha de conèixer el moment en què s’ ha près aquesta informació. Cada comptador és diferent, i per tant s’ hauran d’ agafar unes dades determinades. En aquest projecte es prenen dades de dos comptadors, un comptador que mesura el consum elèctric i un altre que mesura el consum d’ aigua. En el primer, s’ han de prendre dades de 5 dígits que marquen el consum en kWh (KiloWatts-hora consumits) [Figura 8]. En el segon, s’ han de prendre dades de 5 dígits i també de 3 dials amb 3 agulles [Figura 9], i que units marquen el consum d’ aigua en m³. Exactament, els primers quatre dígits marquen els milers, les centenes, les desenes i les unitats respectivament, el cinquè dígit marca les dècimes, el dial de la dreta marca les centèssimes, el dial del centre marca les milèssimes, i el dial de l’ esquerra marca les dècimes de milèsima. Per tant, el tractament de les imatges serà diferent en funció del comptador, tal i com es veurà a continuació. Pàgina 22
Lectura remota de comptadors analògics Raül Caldera Sànchez 3.2.2. Presa de les dades Les dades que s’ envien de la Raspberry al Host són les següents: •El timestamp de la imatge, com a identificador. •La imatge. •Les dades de lectura del comptador. La presa de de dades es realitza a través de la Pi Camera [ref. 6], la qual rep la ordre periòdicament de fer captures al comptador. El mòdul on s’ implementa la captura i el setup de la càmara és el camera_operations.py. Aquest mòdul implementa les funcions camera_setup i shoot. La primera funció crea l’ objecte de camera i estableix els paràmetres de la càmara. Aquests paràmetres poden ser modificats a través del pas de missatges amb el protocol MQTT [ref. 29] amb el Host, tal i com es mostrarà més endavant. Tenen un valor numèric per defecte que s’ estableix dins d’ un rang de valors possibles. Els paràmetres en qüestió que s’ ha establert que es poden modificar són: •La resolució, per defecte ‘HD’ [ref. 22]. •El framerate, per defecte 15 [ref. 23]. Pàgina 23 Figura 8: Comptador de llum Figura 9: Comptador d' aigua
Lectura remota de comptadors analògics Raül Caldera Sànchez •L’ angle de rotació de la imatge, per defecte 0 [ref. 24]. •La nitidesa, per defecte 100 [ref. 25]. •La brillantor, per defecte 60 [ref. 26]. •La saturació, per defecte 100 [ref. 27]. •Girar la imatge, horitzontalment i verticalment [ref. 74]. La funció shoot és la que s’ encarrega de realitzar la captura. La imatge es captura en forma de stream de bytes [ref. 28] ja que s’ ha de transmetre al servidor via MQTT [ref. 29] en aquest format. Per al processat no hi ha problema amb aquest format ja que OpenCV [ref. 12] pot treballar amb imatges com a stream de bytes. A mesura que es capturen imatges, aquestes no es guarden a la SD, per tal de no acabar ocupant tota la memòria. La funció simplement retorna l’ stream de bytes. Totes les imatges es sobreescriuen posteriorment en el fitxer original.jpg. La funció també retorna el timestamp que serà el nom identificador de la imatge. Tant l’ stream de bytes com el timestamp seran enviats posteriorment, juntament amb l’ string de dades corresponent a la lectura del comptador. 3.2.3. Tractament de les dades Un cop presa la imatge, es passa a fer-se el processat per tal d’ extreure’ n les dades. Com s’ ha esmentat anteriorment, per a cada comptador s’ ha de fer un processat diferent, degut a que les dades s’ han d’ extreure de diferents maneres (dígits, agulles, diferents colors… ). A continuació s’ explica com es realitza el processat de les imatges per al comptador de llum i per al comptador d’ aigua. 3.2.3.1. Processat d’ imatge del comptador de llum La imatge a processar del comptador de llum és com la que s’ ha mostrat anteriorment [Figura 8]. L’ objectiu és reconèixer els dígits de la imatge que pertanyen al consum energètic i fer l’ OCR d’ aquests dígits [ref. 33]. Per tal de fer això es segueixen aquests passos: •Es realitza un Canny edge detector a la imatge [ref. 30], per a detectar-ne els eixos i facilitar-ne el posterior processat. •Com que la imatge pot estar una mica torçada, s’ alinia rotant-la amb la inclinació necessària per tal de deixar-la recta. Això es fa amb el mètode de Houghlines [ref. 31]. Pàgina 24
Lectura remota de comptadors analògics Raül Caldera Sànchez •Un cop amb la imatge en format Canny i aliniada, es busquen els contorns de la imatge [ref. 32], és a dir, les formes que hi ha la imatge producte dels eixos trobats. •Dins del conjunt de contorns trobats, hi ha d’ haver els que corresponen als dígits del comptador. Per tant, de tots els contorns, s’ han de filtrar aquells que pertanyin als dígits. Aquest fitrat consisteix primerament en agafar els contorns d’ una certa alçada i amplada que puguin correspondre als contorns dels dígits, i després filtrar-los en funció de la seva posició en la imatge. Com que els dígits estaran gairebé en una mateixa posició Y (vertical) de la imatge, s’ ha de veure quins dels contorns poden ser els dígits en funció d’ aquesta posició Y. També han d’ estar separats entre ells unes distàncies més o menys iguals en la seva posició X, ja que els dígits estan un al costat de l’ altre. •Un cop trobats els contorns filtrats, aplicant el criteri de les posicions, es fan retalls de la imatge original de forma recangular a la posició de la imatge on es creu que hi ha cada dígit. A cada imatge, que correspon a un sol dígit, se li aplica un thresholding per a passarla en blanc i negre, per tal de facilitar el posterior OCR [ref. 33]. •Finalment, amb la imatge de cada dígit amb el thresholding aplicat, es fa l’ OCR de cada dígit, un per un, passant el valor trobat a un string, preparat per a ser transmès. Totes els passos descrits anteriorment es realitzen en les funcions del mòdul OCR_processing.py, i tot el processat es pot realitzar executant el mòdul full_electricity_processing.py, que corre totes les funcions i retorna l’ string de dades dels dígits. Les funcions de OCR_processing.py són les següents: - image_to_canny(img): La funció rep com a paràmetre l’ stream de bytes [ref. 28] corresponent a la captura que ha fet la càmara, i guarda la imatge amb el nom original.jpg. A continuació, transforma la imatge en blanc i negre amb la funció cv2.cvtColor [ref. 34]. A la imatge en blanc i negre se li aplica llavors el Canny edge detector [ref. 30] amb la funció cv2.Canny [ref. 35]. Es guarda la imatge Canny amb el nom electricity_meter_canny.jpg [Figura 10]. La funció retorna la variable de la imatge Canny. Pàgina 25
Lectura remota de comptadors analògics Raül Caldera Sànchez - Pàgina 32 Figura 17: Imatge del comptador d’ aigua en format Canny Figura 18: Imatge de les línies horitzontals trobades en el comptador d’ aigua amb el mètode HoughLines Figura 19: Imatge del comptador d’0 aigua en format Canny, orientada horitzontalment
Lectura remota de comptadors analògics Raül Caldera Sànchez - red_detection(cropped_img, needle=True): Els paràmetres d’ aquesta funció són la imatge original retallada i un booleà amb valor per defecte True. Si needle==True, es crida la funció per a detectar les agulles de color vermell. Si needle==False, es crida la funció per a detectar el dígit de color vermell. Per a la detecció de les agulles o del dígit, primerament es passa la imatge de format BGR a format HSV [ref. 47] amb la funció cv2.cvtColor [ref. 34] i el paràmatre cv2.COLOR_BGR2HSV [ref. 49]. A continuació es genera una màscara per a la imatge en format HSV, per tal d’ aillar el color vermell. Per tal de fer això es defineixen dos arrays, lower i upper, que marquen els valors mínims i màxims de matís (Hue), saturació (Saturation) i lluminositat (Value) que deixa passar la màscara. Aquesta es genera amb la funció cv2.inRange [ref. 50]. Un cop s’ obté la màscara, aquesta s’ aplica a la imatge original retallada amb la funció cv2.bitwise_and [ref. 51], i s’ obté la imatge amb les agulles o el dígit aïllat. La imatge es passa a format Canny per a poder detectar posteriorment les formes. La imatge en format HSV [ref. 47] es guarda amb el nom redhsv.jpg [Figura 20], la imatge original amb la màscara aplicada es guarda amb el nom red.jpg [Figura 21], i les imatges Canny del dígit i de les agulles es guarden sota el nom de decimal_edges.jpg [Figura 22] i needle_edges.jpg [Figura 23] respectivament. La funció retorna la imatge original en blanc i negre per a la posterior detecció dels dials de les agulles. Pàgina 33 Figura 20: Imatge de les agulles del comptador d’aigua en format HSV
Lectura remota de comptadors analògics Raül Caldera Sànchez Pàgina 34 Figura 21: Imatge de les agulles del comptador després d’aplicar la màscara Figura 22: Contorn trobat del dígit vermell del comptador d’aigua. Figura 23: Contorns trobat de les agulles del comptador d’aigua
Lectura remota de comptadors analògics Raül Caldera Sànchez - dial_detection(img_copy_gray): Aquesta funció pren la imatge original en blanc i negre per tal de detectar els dials de les agulles. El primer pas que realitza és aplicar un thresholding a la imatge per tal de preparar-la per a la detecció dels cercles dels dials [Figura 24]. Un cop fet aquest pas, es realitza la detecció dels cercles amb l’ ajuda de la funció cv2.HoughCircles [ref. 52] i el paràmetre cv2.HOUGH_GRADIENT [ref. 70]. La informació de cada cercle es guarda en un array de tuples on cada tupla té la posició X i Y del cercle i el radi R. Un cop es té aquest array, es pren la posició Y de cada cercle per tal d’ identificar quin correspon a cada dial, i un cop conegut això, es retalla la imatge Canny de cada dial en funció de les dimensons del cercle. Aquestes imatges es guarden amb el nom dial01.jpg, dial001.jpg i dial0001.jpg [Figura 25]. Per a visualitzar els cercles que s’ han trobat a la imatge, aquests es dibuixen sobre la imatge original amb la funció cv2.circle [ref. 69], i es guarda la imatge amb el nom img_hough_circles.jpg [Figura 26]. Pàgina 35 Figura 24: Imatge del comptador d’aigua a la zona de les agulles amb el thresholding aplicat Figura 25: Imatge dels contorns de les agulles trobats
Lectura remota de comptadors analògics Raül Caldera Sànchez - needle_value(): Aquesta funció és la més important, ja que s’ encarrega de detectar les línies de les agulles, calcular-ne l’ angle, i a partir de l’ angle calcular-ne el valor que marca l’ agulla en el dial. Per tal de fer això, per a cada imatge de les agulles que la anterior funció dial_detection ha creat, es segueixen els passos que es descriuen a continuació. Primerament, es busquen les línies rectes que pertanyin a les agulles amb la funció cv2.HoughLines [ref. 36]. Aquesta funció crea un array de tuples amb informació sobre la rho i la theta, que representen la línia. Recordem que la línia es representa com ,on la rho és la distància perpendicular des de l’ origen a la línia, i la theta és l’ angle format per aquesta línia perpendicular i l’ eix horitzontal, tal i com es mostra a la següent figura [Figura 27] [ref. 53]. Les línies detectades es dibuixen amb la funció cv2.line [ref. 54]. Pàgina 36 Figura 26: Imatge dels cercles corresponents als dials de les agulles trobats Figura 27: Representació gràfica del principi en què es basa el mètode HoughLines
Lectura remota de comptadors analògics Raül Caldera Sànchez Observem com coneixent rho i theta, queda una línia en funció de X i Y. La funció needle_value en calcula dos punts x1, y1 i x2, y2. Coneixent aquests punts, es poden fer suposicions de quina direcció té la línia [Figura 28]. Per a fer-ho, s’ han de tenir en compte dues coses: •El valor de Y augmenta a mesura que baixa en la imatge (Augmenta de dalt a baix). •El valor de X augmenta d’ esquerra a dreta. Coneixent això se sap que: •Si y2 > y1: En aquest cas, significa que la línia està en direcció descendent. Per tant la l’ agulla ha d’ estar en el segon quadrant del dial o en el quart. Per a saber-ho, es compara el valor de y1 i y2 amb el valor y_center, que és el valor de y del centre de la imatge. Si el valor de y1 s’ aproxima més al valor central, significa que l’ agulla està en el quart quadrant, i si el valor de y2 s’ hi aproxima més, l’ agulla està en el segon quadrant. •Si y2 < y1: La línia està en direcció ascendent. Per tant l’ agulla ha d’ estar en el primer quadrant o en el tercer. Es torna a comparar el valor de y1 i y2 amb el valor y_center. Si y2 s’ aproxima més a y_center, l’ agulla està en el tercer quadrant. Si y1 s’ hi aproxima més, l’ agulla està en el primer quadrant. Pàgina 37 Figura 28: Esquema de criteri de detecció dels quadrants on es troben les agulles
Lectura remota de comptadors analògics Raül Caldera Sànchez Un cop es coneix en quin quadrant està l’ agulla es pot calcular l’ angle de l’ agulla respecte l’ eix horitzontal. L’ angle es calcula amb la funció np.arctan2 [ref. 55]. En funció del quadrant es calcula de forma diferent. A continuació es mostra com es realitza el càlcul de l’ angle per a cada quadrant [Figura 29]. En buscar les línies de les agulles, segurament apareixeran diverses línies amb una certa desviació [Figura 30]. Es calcula l’ angle de totes les línies i es fa la mitjana de l’ angle, i aquesta mitjana és el valor que es pren com a definitiu. Pàgina 38 Figura 29: Esquema de criteri de detecció de l’angle les agulles Figura 30: Línies de les agulles detectades amb el mètode HoughLines
Lectura remota de comptadors analògics Raül Caldera Sànchez Un cop calculat l’ angle de l’ agulla respecte l’ eix horitzontal, s’ ha de fer la conversió de l’ angle al número que marca en el dial. Es fa això prenent com a referència que el 0 es troba als 90 graus (eix vertical). A partir d’ aquí, cada 3.6 graus més o menys, és una dècima més o menys. Es fa un sumatori fins que l’ angle concorda i així s’ aconsegueix el valor del dial. Un cop conegut el valor de totes les agulles, aquests valors s’ ajunten en un string, i posteriorment s’ ajunten amb els valors que han donat els dígits amb el processat de les funcions del modul ocr_processing_water.py. 3.2.4. Enviament de les dades Un cop obtingudes les dades fruit del processat d’ imatge, aquestes s’ han d’ enviar al Host, per tal d’ emmagatzemar-les. A continuació es mostrarà com s’ ha implementat aquesta tasca. 3.2.4.1. El protocol MQTT i paho.mqtt Per a la comunicació entre la màquina Host i la Raspberry Pi [ref. 8], s’ ha establert el pas de missatges via protocol MQTT [ref. 29]. El protocol MQTT (Message Quering Telemetry Transport ) és un protocol de pas de missatges que treballa per sobre del nivell de TCP/IP (A la capa d’ aplicació com altres protocols com l’ HTTP). Aquest protocol està pensat per a enviar missatges entre dispositius remots amb connexions on l’ ample de banda de la xarxa és limitat, i també per a dispositius com sensors. La estructura del protocol es basa en un patró de subscripció i publicació de tòpics, i dins d’ aquests tòpics es produeix el pas de missatges. Per a rebre els missatges d’ un determinat tòpic, el dispositiu client s’ ha de subscriure al tòpic en qüestió, i rebrà els missatges quan algun altre dispositiu envïi un missatge amb el tòpic. En el protocol MQTT [ref. 28] [Figura 31] existeixen tres entitats: el subscriptor, que es subscriu al tòpic, el publicador, que publica missatges dins del tòpic, i el broker, que és l’ intermediari encarregat de distribuïr els missatges als clients interessats. Pàgina 39
Lectura remota de comptadors analògics Raül Caldera Sànchez Per a la implementació del protocol MQTT [ref. 28] en aquest projecte, s’ ha utilitzat la llibreria paho.mqtt [ref. 17] de Python, la qual implementa les funcionalitats d’ aquest protocol. Amb aquesta llibreria s’ han pogut definir els tòpics i els missatges que s’ han d’ enviar en cada ocasió. Per tal de realitzar això, s’ han establert dos clients: un és la màquina Host, que fa les requests tant de informació dels comptadors com per a modificar els paràmetres de la càmara. L’ altre és la Raspberry Pi [ref. 8], que atèn les peticions de la màquina Host i envia les dades solicitades o bé modifica els paràmetres de la càmara. En el prototip es fa servir un broker de test disponible públicament que ofereix mosquitto [ref. 56], però es podria utilitzar un propi. De la llibreria s’ utilitzen les següents funcions: •mqtt.Client: Per a crear el client del protocol [ref. 57]. •connect: Per a connectar-se al broker desitjat [ref. 58]. •on_connect: Per a establir què fer quan el client es connecta al broker. Per exemple, un cop connectat, el client es pot subscriure als tòpics que li interessen, i passar a esperar missatges [ref. 59]. •on_publish: Per a establir quines accions realitzar quan es publica un missatge [ref. 60]. •on_message: Per a establir quines accions realitzar quan es rep un missatge. Aquí s’ atendran els diferents tipus de missatge i s’ actuarà en conseqüència [ref. 61]. Pàgina 40 Figura 31: Principi de funcionament del protocol MQTT
Lectura remota de comptadors analògics Raül Caldera Sànchez •on_subscribe: Per a establir quines accions realitzar quan el client s’ ha subscrit a un tòpic. Per exemple, en el Host (sub.py), es mira quin tipus de request se li està demanant i passa a publicar-la, per tal de rebre els missatges de tornada dels tòpics que s’ ha acabat de subscriure [ref. 62]. 3.2.4.2. Estructura de pas de missatges Per a la implementació del pas de missatges s’ han creat dos mòduls: sub.py, que actua com a client per la part de la màquina HOST, fa les peticions de dades o de modificació de paràmetres de la càmara a la Raspberry Pi [ref. 8], rep les dades dels comptadors i s’ encarrega de guardar-les a la base de dades. L’ altre, pub.py, actua com a client per part de la Raspberry Pi , rep les peticions del client de la màquina Host, interactua amb la càmara per a que capturi les imatges, executa les funcions de processat d’ imatge, envia la imatge, el nom (timestamp) i la dada de lectura, i també modifica els paràmetres de la càmara si rep la petició corresponent. L’ estructura que s’ ha implementat per al pas de missatges és la següent: HOST A sub.py (Host), el client Host es subscriu als següents tòpics: •ocr_image_name: tòpic per tal de rebre el nom de la imatge en forma de timestamp (string). •ocr_image: tòpic per tal de rebre la imatge en forma de BLOB [ref. 28]. •ocr_data: tòpic per a rebre les dades de lectura del comptador (string). El Host envia missatges amb els següents tòpics: •ocr_request: quan el client vol informació del comptador, envia un missatge amb aquest tòpic. El cos del missatge és: •”1”: Si es vol rebre informació del comptador d’ aigua. •”2”: Si es vol rebre informació del comptador de llum. Pàgina 41
Lectura remota de comptadors analògics Raül Caldera Sànchez 6. CONDICIONS PER A L’ EXECUCIÓ DEL SISTEMA Per tal d’ utilitzar el sistema de manera correcta, l’ usuari ha de conèixer alguns aspectes sobre aquest, que es detallaran a continuació. 6.1. Posada en marxa i correcte funcionament del sistema. Per a posar en marxa el sistema correctament, s’ han de complir els següents requisits: •Tenir la montura col·locada correctament en el comptador, de manera que la càmara tingui en el seu camp de visió les dades que s’ han de prendre del comptador, ja sigui de manera directa o través del mirall que hi ha al suport. •Que la montura del comptador es trobi en una zona amb connexió Wi-Fi, per tal que la Raspberry Pi [ref. 8] pugui rebre les peticions de presa de dades, així com transmetre les dades. •Tenir la Raspberry Pi alimentada correctament. •Si el comptador es troba en una zona poc iluminada o és de nit, fer ús dels LEDs per a iluminar-lo. •Per la part del Host, tenir-lo configurat de manera que pugui establir connexió amb la Raspberry Pi [ref. 8], i tenir la taula de Cron configurada correctament per a fer la petició de dades amb el comptador que es desitgi, i també per guardar les dades de la base de dades als fitxers csv, si així es desitja. •Utilitzar una lent adequada per tal que la càmara pugui prendre imatges nítides. D’ altra manera el processat d’ imatge serà impossible. A l’ apartat 6.2.2. es tracta aquest tema. 6.2. Implementacions extres del sistema. 6.2.1. Els miralls Els miralls [Figura 34] s’ utilitzen per tal de poder realitzar captures del comptador de manera indirecta i des d’ un angle més tancat, i així optimitzar al màxim l’ espai que ocupa la montura. Aquest és un dels avantatges que suposa fer ús dels miralls. Pàgina 48
Lectura remota de comptadors analògics Raül Caldera Sànchez Tot i així s’ han de tenir en compte alguns aspectes a l’ hora de fer ús dels miralls. El primer és que, si es captura la imatge dels dígits a través dels miralls, aquesta imatge estarà cap per avall, i per tant s’ haurà de rotar 180 graus, i voltejar-la horitzontalment. Per tal de facilitar les coses per a l’ usuari, aquest pot fer ús del canvi de paràmetres de la càmara [ref. 5] que ofereix el protocol de pas de missatges entre el Host i la Rapberry, tal i com s’ ha vist en l’ apartat 3.2.4.2. Un aspecte important a tenir en compte és que, en el comptador d’ aigua, si es prenen imatges a través del mirall, no és possible el processat de les agulles, només dels dígits. Per tant, s’ ha d’ adaptar el sistema per al processat del comptador d’ aigua sense agulles. Això comporta una pèrdua de dades. Tot i així, les agulles marquen els dígits menys significatius, així que la pèrdua d’ aquests dígits no comporta una pèrdua d’ informació molt significativa. 6.2.2. La lent Durant la realització d’ aquest projecte s’ ha vist que la càmara [ref. 5] no és capaç d’ enfocar gaire bé a distàncies curtes. Aquest sistema requereix capturar imatges a una distància força petita (uns 10 centímetres). La càmara no és capaç d’ autoenfocar-se, i per tant s’ ha requerit fer ús d’ una lent externa de 12 dioptries. Per tal de conèixer la força necessària de la lent, s’ ha fet ús de la fòrmula [ref. 76] que es mostra a continuació: On f és la inversa de la força de la lent, s és la distància entre la lent i el comptador, i s’ és la distància focal, que és la distància on la càmara és capaç d’ enfocar. Sabent que la distància s és de 10 centímetres, i que la càmara enfoca a uns 50-75 centímetres (s’), es pot trobar la força 1/f necessària de la lent, que en aquest cas és d’ entre 11,33 i 12 dioptries. Pàgina 49 Figura 34: Mirall colocat al suport
Lectura remota de comptadors analògics Raül Caldera Sànchez 7. TESTEIG DEL SISTEMA A continuació es mostrarà com s’ han realitzat un conjunt de testejos del sistema, els resultats que s’ han extret d’ aquests i les conclusions que se’ n poden extreure. 7.1. Testejos amb el comptador de llum 7.1.1. Càmara enfocant directament al comptador En aquest test, fem que el sistema faci lectures del comptador de llum durant 30 minuts. El comptador no està connectat a la corrent i per tant no donarà valors diferents durant aquest temps, però es comprovarà la robustesa del sistema, ja que durant les proves s’ ha vist que el processat d’ imatge és força delicat. El mínim canvi, ja sigui en la orientació de la càmara, la lluminositat, etc... afecta al processat. Per tant, la intenció d’ aquest test és comprovar que el sistema pot actuar de forma independent durant un cert temps donant resultats correctes, malgrat la fragilitat del processat d’ imatge. El valor que marquen els dígits del comptador és 06830 [Figura 35]. Per tal de fer això, comprovem primer que el sistema és capaç de rebre una petició des del Host, capturar la imatge, processar-la i enviar les dades i la imatge a la base de dades del Host. Pàgina 50 Figura 35: Montatge del sistema amb el comptador de llum
Lectura remota de comptadors analògics Raül Caldera Sànchez Per tal de fer això cridem sub.py manualment des del Host. A la Raspberry Pi [ref. 8] s’ escolten les peticions ja que pub.py s’ està executant [Figura 36] [Figura 37]. Com podem observar, s’ ha fet la petició d’ obtenir les dades del comptador de llum, la Raspberry Pi ha fet el processat, ha enviat les dades i la imatge, i el Host ha guardat les dades a la base de dades. Pàgina 51 Figura 37: Flux d' execució de pub.py durant el processat del comptador de llum. Figura 36: Flux d' execució de sub.py
Lectura remota de comptadors analògics Raül Caldera Sànchez Per tal de comprovar que això pot funcionar independentment, modifiquem la taula Crontab [ref. 19][Figura 38], per tal que la acció que s’ ha vist anteriorment es produeixi periòdicament, en aquest cas cada minut durant 30 minuts. Ara el Host farà una petició de dades cada minut. Després de 30 minuts, es comprova si les dades s’ han guardat a la base de dades, a la taula images_LLUM. Tal i com es veu [Figura 39], així és. El primer camp és el nom de la imatge (data de quan s’ ha près la imatge), el segon camp conté la imatge en forma de stream de bytes [ref. 28], i el tercer camp la lectura OCR. Com s’ oberva, les dades obtingudes són generalment correctes, però en algun cas hi ha un dígit que no ha donat el valor que havia de donar. Pàgina 52 Figura 38: Configuració de la taula Cron per al testeig Figura 39: Contingut de la base de dades després del primer testeig
Lectura remota de comptadors analògics Raül Caldera Sànchez Es realitza un segon testeig, després de retocar alguns elements del codi, i observem quins són els resultats [Figura 40]. Es pot comprovar que hi ha hagut també algun error. Tot i així, la majoria de mostres segueixen sent bones. Es veu que de mitja hi ha uns 3-4 errors per cada 30 mostres. Per tant, el sistema dóna uns valors correctes el 90% de les vegades, aproximadament. Un cop es tenen els valors a la base de dades, aquests es poden visualitzar en un fitxer csv, tal i com s’ explica en l’ apartat 4.2. Fent ús de l’ script electricity_to_csv.sh, es passen les dades al fitxer electricity_data.csv [Figura 41]. Pàgina 53 Figura 40: Contingut de la base de dades després del segon testeig
Lectura remota de comptadors analògics Raül Caldera Sànchez 7.1.2. Càmara enfocant al mirall En aquest cas, realitzarem el testeig de la presa de dades del comptador de llum amb la càmara enfocant al mirall, el qual reflecteix la lectura del comptador [Figura 42]. Pàgina 54 Figura 41: Extracte del fitxer electricity_data .csv
Lectura remota de comptadors analògics Raül Caldera Sànchez El testeig també consistirà en realitzar una petició de dades cada minut, durant 30 minuts, per tal de comprovar si el processat d’ imatge és consistent. Després d’ haver adaptat el codi per tal que el processat funcioni adequadament amb la imatge reflectida del mirall, es procedeix a executar pub.py, el qual escolta les peticions del Host, que crida sub.py periòdicament. Un aspecte important és que, a l’ hora de fer el setup de la càmara, se li ha d’ establir un paràmatre de rotació de 180 graus [ref. 24] i voltejar la imatge horitzontalment [ref. 74], ja que en la imatge, els dígits estaran al revés. Observem com el sistema és capaç de prendre la imatge [Figura 43], detectar-ne la desviació, rotar-la [Figura 44], detectar els contorns dels dígits [Figura 45] [Figura 46], i passar-los a text. Pàgina 55 Figura 42: Montatge del sistema amb el comptador de llum, amb la càmara enfocant el mirall
Lectura remota de comptadors analògics Raül Caldera Sànchez Pàgina 56 Figura 43: Captura presa de la reflexió del mirall per part de la càmara, ja voltejada i orientada correctament Figura 44: Imatge orientada hortizontalment Figura 46: Dígits trobats a la imatge Figura 45: Contorns filtrats corresponents als dígits
Lectura remota de comptadors analògics Raül Caldera Sànchez Mirem quins són els valors que s’ han guardat a la base de dades durant els 30 minuts [Figura 47]. Com es pot apreciar, aquest cop també hi ha hagut alguns errors, i més que abans amb la càmara orientada directament al comptador, cosa que era d’ esperar. Al final s’ han près unes quantes mostres errònies seguides. Això pot també ser degut a un canvi significatiu en la lluminositat, o un lleuger canvi d’ angle de la imatge presa. Com ja s’ ha dit, petits canvis poden alterar profundament el processat de la imatge, i per tant és convenient la màxima estabilitat del sistema durant les proves. Malgrat tot, la majoria de les mostres tenen el valor correcte. Realitzem un altre testeig de 30 minuts, per tal de corroborar els resultats [Figura 48]. Pàgina 57 Figura 47: Contingut de la base de dades després del primer testeig amb el mirall
Lectura remota de comptadors analògics Raül Caldera Sànchez Pàgina 64 Figura 54: Captura de la reflexió del mirall del comptador d' aigua,voltejada i orientada correctament Figura 55: Imatge orientada hortizontalment Figura 56: Dígits trobats a la imatge
Lectura remota de comptadors analògics Raül Caldera Sànchez A continuació, es pot veure com s’ aïlla el dígit de color vermell, facilitant-ne la seva detecció [Figura 58]. Després del testeig, mirem els valors que s’ han guardat a la base de dades [Figura 59]. Pàgina 65 Figura 57: Dígits trobats a la imatge Figura 58: Dígit vermell després d' aplicar la màscara de color
Lectura remota de comptadors analògics Raül Caldera Sànchez Es veu doncs, que el sistema en general és capaç de processar generalment bé les imatges, tot i que com és habitual hi ha algunes mostres errònies. Cal recordar que el processat del dígit vermell es fa per separat, i per tant la possibilitat d’ error és més alta. Tot i així, es demostra que es pot realitzar bé el processat del comptador d’ aigua amb el mirall, i que es pot detectar bé el dígit vermell, el qual és el més delicat de processar. 7.3. Testejos de canvi de paràmetres de la càmara Tal i com s’ ha explicat en l’ apartat 3.2.4.2., el sistema incorpora la possibilitat de cambiar els paràmetres de la càmara a través del protocol MQTT [ref 29]. S’ han realitzat alguns testejos per comprovar que realment aquesta funcionalitat és utilitzable. A continuació es mostra com intreactuen el Host i la Raspberry Pi [Figura 60][Figura 61]. Pàgina 66 Figura 59: Contingut de la base de dades després de realitzar el testeig
Lectura remota de comptadors analògics Raül Caldera Sànchez Després de realitzar algunes proves modificant els paràmetres, podem veure que, efectivament, els paràmetres de la càmara es modiquen correctament, i en les imatges capturades es poden apreciar les modificacions. [Figura 62][Figura 63][Figura 64]. Pàgina 67 Figura 60: Flux d' execució de pub.py durant la petició de canvi de paràmetres de la càmara. Figura 61: Flux d' execució de pub.py durant la petició de canvi de paràmetres de la càmara. Figura 63: Imatge amb els paràmetres de la càmara modificats (mostra 1) Figura 62: Imatge amb els paràmetres de la càmara modificats (mostra 2) Figura 64: Imatge amb els paràmetres de la càmara modificats (mostra 3)
Lectura remota de comptadors analògics Raül Caldera Sànchez 8. CONCLUSIONS Tal i com s’ ha pogut observar durant els testejos, el sistema és capaç d’ obtenir valors correctes d’ ambdós comptadors, tant amb la càmara enfocant directament al comptador com fent ús dels miralls, però en ambdós casos es prenen un cert nombre de mostres errònies. La causa d’ això es deu en part a la imprecisió de les funcions que ofereixen els mòduls cv2 i pytesseract. Aquestes funcions no ofereixen un processat fiable al 100%, i això és font d’ errors. Per tant, a l’ hora de desenvolupar el codi del processat s’ ha de procurar combatre aquesta ineficiència fent un codi el més robust possible, aprenent d’ aquests errors, i adaptar-s’ hi. Malgrat que el codi s’ ha ideat per tal de minimitzar els errors, és probable que de cara a una versió més avançada que aquest prototipus, els errors de processat es puguin disminuir encara més a base de retocar i adaptar el codi a les necessitats del sistema. Tot i així és difícil assolir una precisió del 100%, sobretot amb el processat del comptador d’ aigua, en el qual hi ha més elements a processar. Malgrat tot, ha quedat demostrat que el processat dels comptadors és possible i que el sistema pot oferir valors de lectura correctes. També s’ ha vist que es poden guardar aquests valors en una base de dades remota i visualitzar-ne el seu contingut amb altres eines com l’ Excel o similars. Per tant, els resultats són positius. La conclusió final és, per tant, que malgrat les imprecisions que les funcions de les llibreries de processat d’ imatge utilitzades aporten al sistema, és possible adaptar-s’ hi per tal de minimitzarne els errors, i és possible realitzar un sistema robust que és capaç de donar lectures correctes, i que a més, pugui evolucionar i millorar a mesura que es desenvolupa. Pàgina 68
Lectura remota de comptadors analògics Raül Caldera Sànchez 9. BIBLIOGRAFIA [ref. 1] IoT Based Data Processing for Automated Industrial Meter Reader using Raspberry Pi [article]. Prachi H. Kulkarni , Pratik D. Kute , V. N. More. IEEE Explore. [Consultat: 20 de febrer de 2017] [ref. 2] Optical Character Recognition System for Seven Segment Display Images of Measuring Instruments [article]. Rakhi P. Ghugardare, Sandip P. Narote, P. Mukherji, Prathamesh M. Kulkarni. IEEE Explore. [Consultat: 20 de febrer de 2017] [ref. 3] A Low cost Data Acquisition System From Digital Display Instruments Employing Image Processing Technique [article]. S. Ghosh, S.Shit. IEEE Explore. [Consultat: 20 de febrer de 2017] [ref. 4] Recognition of Numerals on Digital Meters in Dynamic Measuring [article]. C. Xing-chen, D. Hui-chuan, W. Jin-ling. IEEE Explore [Consultat: 20 de febrer de 2017] [ref. 5] Pi NoIR Camera V2 [en línia]. Raspberry Pi. Adreça URL: https://www.raspberrypi.org/products/pi-noir-camera-v2/ [Consultat: 7 de febrer de 2017] [ref. 6] Pi Camera V2 [en línia] Raspberry Pi. Adreça URL: https://www.raspberrypi.org/products/camera-module/ [Consultat: 7 de febrer de 2017] [ref. 7] Pi Camera Python Module Manual [en línia]. Dave Jones. Adreça URL: https://picamera.readthedocs.io/en/release-1.13/ [Consultat: 14 de febrer de 2017] [ref. 8] Raspberry Pi 3 Model B [en línia]. Raspberry Pi. Adreça URL: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ [Consultat: 7 de febrer de 2017] [ref. 9] Python [en línia]. Python. Adreça URL: https://www.python.org/ [Consultat: 7 de febrer de 2017] [ref. 10] Python math module [en línia]. Python. Adreça URL: https://docs.python.org/2/library/math.html [Consultat: 26 de febrer de 2017] [ref. 11] Python time module [en línia]. Python. Adreça URL: https://docs.python.org/2/library/time.html [Consultat: 26 de febrer de 2017] [ref. 12] OpenCV cv2 Python module [en línia]. Python.Adreça URL: https://pypi.python.org/pypi/opencv-python [Consultat: 20 de febrer de 2017] [ref. 13] Python PIL module [en línia]. Python. Adreça URL: http://www.pythonware.com/products/pil/ [Consultat: 22 de febrer de 2017] [ref. 14] Python Pytesseract module [en línia]. Tesseract. Adreça URL: https://pypi.python.org/pypi/pytesseract/0.1 [Consultat: 7 de febrer de 2017] [ref. 15] Python numpy module [en línia]. Python. Adreça URL: https://pypi.python.org/pypi/numpy [Consultat: 1 de març de 2017] [ref. 16] OpenCV practice: OCR for the electricity meter [en línia]. M. Kompf. Adreça URL: https://www.mkompf.com/cplus/emeocv.html [Consultat: 1 de març de 2017] Pàgina 69
Lectura remota de comptadors analògics Raül Caldera Sànchez [ref. 17] Python MQTT module paho-mqtt [en línia]. Mosquitto. Adreça URL: https://mosquitto.org/documentation/python/ [Consultat: 1 de març de 2017] [ref. 18] Pyhton SQLite3 module [en línia]. Python. Adreça URL: https://docs.python.org/2/library/sqlite3.html [Consultat: 12 de març de 2017] [ref. 19] Cron tables quick reference [en línia]. Admin’s Choice. Adreça URL: http://www.adminschoice.com/crontab-quick-reference [Consultat: 15 d’ abril de 2017] [ref. 20] OpenSCAD [en línia]. OpenSCAD .Adreça URL: http://www.openscad.org/ [Consultat: 20 d’ abril de 2017] [ref. 21] SQLite [en línia]. SQLite. Adreça URL: https://www.sqlite.org/ [Consultat: 1 de març de 2017] [ref. 22] Pi camera resolution [en línia]. Pi camera docs. Adreça URL: http://picamera.readthedocs.io/en/release1.10/api_camera.html#picamera.camera.PiCamera.resol ution [Consultat: 20 de febrer de 2017] [ref. 23] Pi camera framerate [en línia]. Pi camera docs. Adreça URL: http://picamera.readthedocs.io/en/release1.10/api_camera.html#picamera.camera.PiCamera.fram erate [Consultat: 20 de febrer de 2017] [ref. 24] Pi camera rotation [en línia]. Pi camera docs. Adreça URL: http://picamera.readthedocs.io/en/release1.10/api_camera.html#picamera.camera.PiCamera.rotati on [Consultat: 20 de febrer de 2017] [ref. 25] Pi camera sharpness[en línia]. Pi camera docs. Adreça URL: http://picamera.readthedocs.io/en/release1.10/api_camera.html#picamera.camera.PiCamera.sharp ness [Consultat: 20 de febrer de 2017] [ref. 26] Pi camera brightness[en línia]. Pi camera docs. Adreça URL: http://picamera.readthedocs.io/en/release1.10/api_camera.html#picamera.camera.PiCamera.bright ness [Consultat: 20 de febrer de 2017] [ref. 27] Pi camera saturation [en línia]. Pi camera docs. Adreça URL: http://picamera.readthedocs.io/en/release1.10/api_camera.html#picamera.camera.PiCamera.satur ation [Consultat: 20 de febrer de 2017] [ref. 28] SQLite byte stream type (BLOB) [en línia]. Python. Adreça URL: https://sqlite.org/datatype3.html [Consultat: 1 de març de 2017] [ref. 29] MQTT protocol [en línia]. MQTT. Adreça URL: http://mqtt.org/ [Consultat: 1 de març de 2017] [ref. 30] Canny edge detection [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/da/d22/tutorial_py_canny.html [Consultat: 8 de març de 2017] [ref. 31] Hough line transform [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html [Consultat: 9 de març de 2017] Pàgina 70
Lectura remota de comptadors analògics Raül Caldera Sànchez [ref. 32] Contours [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/d4/d73/tutorial_py_contours_begin.html [Consultat: 13 de març de 2017] [ref. 33] Optical Character Recognition [en línia]. Wikipedia. Adreça URL: https://en.wikipedia.org/wiki/Optical_character_recognition [Consultat: 1 de febrer de 2017] [ref. 34] cv2.cvtColor [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.2.0/df/d9d/tutorial_py_colorspaces.html [Consultat: 8 d’ abril de 2017] [ref. 35] cv2.cvtCanny [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/dd/d1a/group__imgproc__feature.html#ga04723e007ed888ddf11d9ba 04e2232de [Consultat: 1 de març de 2017] [ref. 36] cv2.HougLines [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html [Consultat: 5 de març de 2017] [ref. 37] cv2.getRotationMatrix2D [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/da/d6e/tutorial_py_geometric_transformations.html [Consultat: 8 de març de 2017] [ref. 38] cv2.warpAffine [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/d5/df1/group__imgproc__hal__functions.html#ga8a534cca6fb845c9ac 77f10c35f67c0c [Consultat: 8 de març de 2017] [ref. 39] cv2.findContours [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/d3/dc0/group__imgproc__shape.html#ga17ed9f5d79ae97bd4c7cf184 03e1689 [Consultat: 10 de març de 2017] [ref. 40] cv2.drawContours [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/d6/d6e/group__imgproc__draw.html#ga746c0625f1781f1ffc90562591 03edbc [Consultat: 10 de març de 2017] [ref. 41] cv2.boundingRect [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/trunk/d3/dc0/group__imgproc__shape.html#gacb413ddce8e48ff3ca61ed7cf 626a366 [Consultat: 12 de març de 2017] [ref. 42] Counter.most_common [en línia]. Python collections documentation. Adreça URL: https://docs.python.org/2/library/collections.html [Consultat: 12 de març de 2017] [ref. 43] cv2.drawContours [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.1.0/d6/d6e/group__imgproc__draw.html#ga07d2f74cadcf8e305e810ce8e ed13bc9 [Consultat: 12 de març de 2017] [ref. 44] cv2.adaptiveThreshold [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.1.0/d7/d4d/tutorial_py_thresholding.html [Consultat: 12 de març de 2017] [ref. 45] Python pytesseract module [en línia]. Python Pytesseract. Adreça URL: https://pypi.python.org/pypi/pytesseract/0.1 [Consultat: 7 de febrer de 2017] Pàgina 71
Lectura remota de comptadors analògics Raül Caldera Sànchez [ref. 46] Pytesseract: recognition of single digits [en línia]. Github. Adreça URL: https://github.com/tesseract-ocr/tesseract/wiki/FAQ#how-do-i-recognize-only-digits [Consultat: 14 de març de 2017] [ref. 47] HSL & HSV [en línia]. Wikipedia. Adreça URL: https://en.wikipedia.org/wiki/HSL_and_HSV [Consultat: 7 d’ abril de 2017] [ref. 48] Hough Circle Transform [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html [Consultat: 1 d’ abril de 2017] [ref. 49] cv2.COLOR_BGR2HSV [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.1.0/d7/d1b/group__imgproc__misc.html#gga4e0972be5de079fed4e3a10e 24ef5ef0aa4a7f0ecf2e94150699e48c79139ee12 [Consultat: 7 d’ abril de 2017] [ref. 50] cv2.inRange [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.0- beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html [Consultat: 8 d’ abril de 2017] [ref. 51] cv2.bitwise_and [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html [Consultat: 8 d’ abril de 2017] [ref. 52] cv2.HoughCircles [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html [Consultat: 1 d’ abril de 2017] [ref. 53] Houghline Transfom Image [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html [Consultat: 9 de març de 2017] [ref. 54] cv2.line [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.1.0/d6/d6e/group__imgproc__draw.html#ga7078a9fae8c7e7d13d24dac25 20ae4a2 [Consultat: 9 de març de 2017] [ref. 55] np.arctan2 [en línia]. Numpy manual. Adreça URL: https://docs.scipy.org/doc/numpy/reference/generated/numpy.arctan2.html [Consulat: 1 d’ abril de 2017] [ref. 56] Mosquitto test server page [en línia]. Mosquitto. Adreça URL: https://test.mosquitto.org/ [Consultat: 7 de març de 2017] [ref. 57] mqtt.client [en línia]. Python paho-mqtt. Adreça URL: https://pypi.python.org/pypi/pahomqtt/1.1#constructor-reinitialise [Consultat: 2 de març de 2017] [ref. 58] mqtt.connect [en línia]. Python paho-mqtt. Adreça URL: https://pypi.python.org/pypi/pahomqtt/1.1#connect-reconnect-disconnect [Consultat: 2 de març de 2017] [ref. 59] on_connect [en línia]. Python paho-mqtt. Adreça URL: https://pypi.python.org/pypi/pahomqtt/1.1#callbacks [Consultat: 2 de març de 2017] Pàgina 72
Lectura remota de comptadors analògics Raül Caldera Sànchez [ref. 60] on_publish [en línia]. Python paho-mqtt. Adreça URL: https://pypi.python.org/pypi/pahomqtt/1.1#callbacks [Consultat: 2 de març de 2017] [ref. 61] on_message [en línia]. Python paho-mqtt. Adreça URL: https://pypi.python.org/pypi/pahomqtt/1.1#callbacks [ref. 62] on_subscribe [en línia]. Python paho-mqtt. Adreça URL: https://pypi.python.org/pypi/pahomqtt/1.1#callbacks [Consultat: 2 de març de 2017] [ref. 63] csv Python module [en línia]. Python documentation. Adreça URL: https://docs.python.org/2/library/csv.html [Consultat: 20 d’ abril de 2017] [ref. 64] UNICODE UTF-8 [en línia]. Unicode character table. Adreça URL: https://unicodetable.com/en/ [ref. 65] Raspberry Pi Kit [en línia]. Amazon. Adreça URL: https://www.amazon.es/Raspberry- OfficialStarterCargadordisipadores/dp/B01D0I5UXK/ref=sr_1_1s=electronics&ie=UTF8&qid=14964 20956&sr=1-1&keywords=Raspberry+Pi+3+Official+Starter+Kit+White [Consultat: 7 de febrer de 2017] [ref. 66] Pi Camera NoIR V2.1 [en línia]. Amazon. Adreça URL: https://www.amazon.es/dp/B01ER2SMHY/ref=pe_386191_124256311_TE_dp₂ [Consultat: 7 de febrer de 2017] [ref. 67] Leds [en línia]. Amazon. Adreça URL: https://www.amazon.es/SODIAL-Diodo-Emisor Ultrabrillante-Blanco/dp/B00CM5DEZO/ref=sr_1_2?ie=UTF8&qid=1496421237&sr=8 2&keywords=comprar+diodos+led [Consultat: 10 de maig de 2017] [ref. 68] Conjunt de cargols i femelles [en línia]. Amazon. Adreça URL: https://www.amazon.com/Generic-Spacer-Assorted-Raspberry-Pi-Standoff/dp/B014J1ZLD6 [Consultat: 10 de maig de 2017] [ref. 69] cv2.circle [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.1.0/d9/db7/group__datasets__gr.html#gga610754124ced68d1f05760b594 8fbb76a6f0d8b2d9e3e947b2a5c1eff9e81ee95 [Consultat: 8 d’ abril de 2017] [ref. 70] cv2.HOUGH_GRADIENT [en línia]. OpenCV documentation. Adreça URL: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html [Consultat: 8 d’ abril de 2017] [ref. 71] Oil Level Reader [en línia]. C. Savina. Adreça URL: https://github.com/techsavi/OilLevelReader [Consultat: 8 de març de 2017] [ref. 72] A-D converter the hard (but cheap!) way [en línia]. K. Sebesta. Adreça URL: http://www.eissq.com/DialADC.html [Consultat: 23 de març de 2017] [ref. 73] Instrument Digitizer using Computer Vision [en línia]. E. Almeida i I. Vodopiviz. Adreça URL: https://hackaday.io/project/10617-instrument-digitizer-using-computer-vision [Consultat: 23 de març de 2017] [ref. 74] Picamera [en línia]. Raspberry. Adreça URL: https://www.raspberrypi.org /documentation/usage/camera/python/README.md [Consultat: 23 de març de 2017] Pàgina 73