{"id":4415,"date":"2022-02-13T02:33:03","date_gmt":"2022-02-13T07:33:03","guid":{"rendered":"https:\/\/espacerm.com\/webgen\/?page_id=4415"},"modified":"2022-02-27T21:38:03","modified_gmt":"2022-02-28T02:38:03","slug":"lecture-du-detecteur-de-qualite-de-lair","status":"publish","type":"page","link":"https:\/\/espacerm.com\/webgen\/lecture-du-detecteur-de-qualite-de-lair\/","title":{"rendered":"IA et lecture du d\u00e9tecteur de qualit\u00e9 de l&rsquo;air"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\" id=\"but\">But<\/h3>\n\n\n\n<p>Le but est de d\u00e9montrer le fonctionnement de base d&rsquo;un r\u00e9seau de neurones artificiels. Cette d\u00e9monstration passe par la lecture de l&rsquo;affichage du d\u00e9tecteur de qualit\u00e9 de l&rsquo;air JSM-131 SE \u00e0 partir d&rsquo;un ordinateur et d&rsquo;une cam\u00e9ra. Les donn\u00e9es captur\u00e9es sont enregistr\u00e9es dans un fichier texte. Le formatage du fichier permettra d&rsquo;importer ces donn\u00e9es dans Excel pour analyse d\u00e9taill\u00e9e.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/capture-1-1024x576.jpg\" alt=\"\" class=\"wp-image-4416\" width=\"512\" height=\"288\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/capture-1-1024x576.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/capture-1-300x169.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/capture-1-768x432.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/capture-1-1536x864.jpg 1536w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/capture-1.jpg 1920w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><br><br>L&rsquo;appareil ne fait que pr\u00e9senter les donn\u00e9es sur un \u00e9cran  LCD. Une cam\u00e9ra capture ces donn\u00e9es. Un programme, en Python, bas\u00e9 sur les r\u00e9seaux de neurones artificiels interpr\u00e8te l&rsquo;affichage des segments clairs, les transformant en cha\u00eene de caract\u00e8res compatibles \u00e0 l&rsquo;importation dans Excel.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/20220227_210044c-1024x643.jpg\" alt=\"\" class=\"wp-image-4712\" width=\"768\" height=\"482\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/20220227_210044c-1024x643.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/20220227_210044c-300x188.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/20220227_210044c-768x482.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/20220227_210044c-1536x964.jpg 1536w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/20220227_210044c-2048x1285.jpg 2048w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><br><br>La cam\u00e9ra se place \u00e0 courte distance de d\u00e9tecteur, l&rsquo;image ne doit pas \u00eatre d\u00e9form\u00e9e. Les cam\u00e9ras web communes produisent une image en barillet (bomb\u00e9e), ce qui n&rsquo;est pas ad\u00e9quat. La cam\u00e9ra de marque ELP, mod\u00e8le ELP-USBFHD01M-MFV, plac\u00e9e \u00e0 15 cm devant le d\u00e9tecteur, g\u00e9n\u00e8re une image tr\u00e8s peu d\u00e9form\u00e9e, de bonne qualit\u00e9, facilement traitable. L&rsquo;ouverture du diaphragme de la cam\u00e9ra s&rsquo;op\u00e8re manuellement, ce qui offre un ajustement de la luminosit\u00e9 parfaite et stable.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"equipements\">\u00c9quipements<\/h3>\n\n\n\n<p><strong>D\u00e9tecteur de qualit\u00e9 de l&rsquo;air JSM-131 SE<\/strong><\/p>\n\n\n\n<h6 class=\"wp-block-heading\" id=\"vivosun-moniteur-de-qualite-de-l-air-testeur-de-co2-detecteur-de-pollution-interieur-hcho-tvoc-pm2-5-pm10-testeur-avec-donnees-en-temps-reel-et-enregistrement-de-valeur-moyenne-pour-la-maison-et-le-bureau-amazon-ca-commerce-industrie-et-science\"><a href=\"https:\/\/www.amazon.ca\/-\/fr\/VIVOSUN-Moniteur-qualit%C3%A9-lair-enregistrement\/dp\/B08SJ1HQF1\/ref=sr_1_2?__mk_fr_CA=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;crid=DVX3S674EWDV&amp;keywords=jsm-131&amp;qid=1644738946&amp;sprefix=jsm-131%2Caps%2C127&amp;sr=8-2&amp;th=1\">VIVOSUN Moniteur de qualit\u00e9 de l&rsquo;air &#8211; Testeur de CO2 &#8211; D\u00e9tecteur de pollution int\u00e9rieur &#8211; HCHO\/TVOC\/PM2.5\/PM10 &#8211; Testeur avec donn\u00e9es en temps r\u00e9el et enregistrement de valeur moyenne pour la maison et le bureau : Amazon.ca: Commerce, Industrie et Science<\/a><\/h6>\n\n\n\n<p><strong>Cam\u00e9ra<\/strong><\/p>\n\n\n\n<h6 class=\"wp-block-heading\" id=\"mini-webcam-usb-a-objectif-varifocal-2-8-12-mm-haute-definition-usb-avec-camera-mise-au-point-manuelle-compatible-avec-la-plupart-des-os-mise-au-point-reglable-webcam-usb-2-0-haute-vitesse-amazon-ca-electronique\"><a href=\"https:\/\/www.amazon.ca\/-\/fr\/dp\/B07R4CLRQH\/?coliid=I2FLA7O5FO71AK&amp;colid=2GX18TFPQFFQ6&amp;psc=1&amp;ref_=gv_ov_lig_pi_dp\">Mini webcam USB \u00e0 objectif varifocal 2,8-12 mm haute d\u00e9finition USB avec cam\u00e9ra, mise au point manuelle, compatible avec la plupart des OS, mise au point r\u00e9glable, webcam USB 2.0 haute vitesse : Amazon.ca: \u00c9lectronique<\/a><\/h6>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"reference\">R\u00e9f\u00e9rence<\/h3>\n\n\n\n<p>Pour s&rsquo;initier au traitement par r\u00e9seau de neurones, je vous sugg\u00e8re de visionner le diaporama que j&rsquo;ai produit sur ce sujet. Voir la partie \u00ab Simulation d&rsquo;un r\u00e9seau de neurones\u00bb :<\/p>\n\n\n\n<h6 class=\"wp-block-heading\" id=\"https-espacerm-com-rnia-rnia-cible-php-numero-image-001\"><a href=\"https:\/\/espacerm.com\/Rnia\/rnia_cible.php?numero_image=001\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/espacerm.com\/Rnia\/rnia_cible.php?numero_image=001<\/a><\/h6>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fonctionnement-du-reseau-de-neurones-artificiels\">Fonctionnement du r\u00e9seau de neurones artificiels<\/h3>\n\n\n\n<p>Nous allons simuler, par programmation, un r\u00e9seau de neurones pr\u00e9cabl\u00e9, fixe, configur\u00e9 pour ex\u00e9cuter une t\u00e2che bien particuli\u00e8re. Ce r\u00e9seau sera le plus simple possible, ayant une seule couche.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive6.jpg\" alt=\"\" class=\"wp-image-4430\" width=\"960\" height=\"720\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive6.jpg 960w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive6-300x225.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive6-768x576.jpg 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/figure><\/div>\n\n\n\n<p><br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive7.jpg\" alt=\"\" class=\"wp-image-4431\" width=\"960\" height=\"720\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive7.jpg 960w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive7-300x225.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive7-768x576.jpg 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/figure><\/div>\n\n\n\n<p><br><br><\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive8.jpg\" alt=\"\" class=\"wp-image-4432\" width=\"960\" height=\"720\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive8.jpg 960w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive8-300x225.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive8-768x576.jpg 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/figure><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"programmation\">Programmation<\/h3>\n\n\n\n<p>Le traitement des images se fait \u00e0 partir de la biblioth\u00e8que de fonctionnalit\u00e9s d&rsquo;<a rel=\"noreferrer noopener\" href=\"https:\/\/www.tutorialspoint.com\/opencv\/\" target=\"_blank\">OpenCV<\/a>.<\/p>\n\n\n\n<p>Examinons, par \u00e9tape, la programmation<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># D\u00e9fini le port de capture vid\u00e9o   \ncap = cv2.VideoCapture(0)\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Lecture en boucle de l'image vid\u00e9o\nwhile True:\n    _, frame = cap.read()<\/pre>\n\n\n\n<p><br><br>L&rsquo;image contenue dans \u00abframe\u00bb est encod\u00e9e en valeurs <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Rouge_vert_bleu\" target=\"_blank\" rel=\"noreferrer noopener\">RGB<\/a> (Rouge-Green-Blue) ou RVB (Rouge-Vert-Bleu)<br>Pour le traitement ult\u00e9rieur, il faut que l&rsquo;image soit encod\u00e9e en valeurs <a rel=\"noreferrer noopener\" href=\"https:\/\/fr.wikipedia.org\/wiki\/Teinte_saturation_lumi%C3%A8re#Syst%C3%A8me_HSV_ou_TSV\" target=\"_blank\">HSV<\/a> (Hue-Saturation-value) ou TSV (Teinte-Saturation-Valeur)<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Conversion de l'image RGB en HSV\nhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><br><br>Cr\u00e9ation d&rsquo;un masque qui servira \u00e0 diff\u00e9rentier les segments allum\u00e9s du reste de l&rsquo;image. Comme l&rsquo;\u00e9cran est en majorit\u00e9 de couleur bleue et que les segments allum\u00e9s sont blancs, nous allons convertir ce qui est bleu (selon une certaine marge) en blanc, ce qui est blanc en noir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    lower_blue = np.array([38, 112, 87])\n    upper_blue = np.array([179, 255, 255])\n    \n    mask = cv2.inRange(hsv, lower_blue, upper_blue)<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><br><br>Affichage \u00e0 l&rsquo;\u00e9cran de l&rsquo;image originale et de l&rsquo;image masque<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    cv2.imshow(\"Frame\", frame)\n    cv2.imshow(\"Mask\", mask)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/frame-et-mask_00-642x1024.jpg\" alt=\"\" class=\"wp-image-4554\" width=\"321\" height=\"512\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/frame-et-mask_00-642x1024.jpg 642w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/frame-et-mask_00-188x300.jpg 188w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/frame-et-mask_00.jpg 664w\" sizes=\"(max-width: 321px) 100vw, 321px\" \/><\/figure><\/div>\n\n\n\n<p><br><br><\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"recherche-de-la-position-des-segments\">Recherche de la position des segments<\/h5>\n\n\n\n<p>Maintenant, il s&rsquo;agit de situer la position des segments dans l&rsquo;image. Nous d\u00e9coupons la fen\u00eatre en partie. Chaque partie correspond \u00e0 une valeur de la mesure; HCHO, TVOC, PM2.5, PM10, Co2. Nous cherchons \u00e0 quel pixel correspond le coin sup\u00e9rieur gauche du premier chiffre de la mesure. Par la m\u00e9thode essais-erreurs, nous trouvons pour HCHO, le pixel y=69, x= 185 que nous  pouvons aussi d\u00e9finir comme ligne 69, colonne 185. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    crop_img = source[y: y+h, x: x+w]\n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    HCHO = mask[69: 125:, 185: 480]\n    cv2.imshow(\"HCHO\", HCHO)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/setup-alignement_HCHO-1.jpg\" alt=\"\" class=\"wp-image-4555\" width=\"148\" height=\"45\"\/><\/figure><\/div>\n\n\n\n<p>Par cet affichage, nous pouvons constater aussi que la cam\u00e9ra est bien align\u00e9e par rapport au d\u00e9tecteur. L&rsquo;image ne penche pas, le haut des segments sont tous align\u00e9s sur l&rsquo;horizontal.<\/p>\n\n\n\n<p><br><br>Nous trouvons pour TVOC, le pixel y=127, x= 185. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">TVOC = mask[127: 183:, 185: 480]\ncv2.imshow(\"TVOC\", TVOC)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/setup-alignement_TVOC-1.jpg\" alt=\"\" class=\"wp-image-4556\" width=\"148\" height=\"44\"\/><\/figure><\/div>\n\n\n\n<p><br><br>Pour PM2.5, le pixel y=186, x= 185.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PM2_5 = mask[186: 242:, 185: 480]\ncv2.imshow(\"PM2_5\", PM2_5)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/setup-alignement_PM2_5-1.jpg\" alt=\"\" class=\"wp-image-4557\" width=\"148\" height=\"45\"\/><\/figure><\/div>\n\n\n\n<p>Pour PM10, le pixel y=246, x= 185.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    PM10 = mask[246: 302:, 185: 480]\n    cv2.imshow(\"PM10\", PM10)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/setup-alignement_PM10-1.jpg\" alt=\"\" class=\"wp-image-4558\" width=\"149\" height=\"44\"\/><\/figure><\/div>\n\n\n\n<p>Pour Co2, le pixel y=305, x= 185.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    CO2 = mask[305: 361:, 185: 480]\n    cv2.imshow(\"CO2\", CO2)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/setup-alignement_Co2-1.jpg\" alt=\"\" class=\"wp-image-4559\" width=\"149\" height=\"44\"\/><\/figure><\/div>\n\n\n\n<p><br><br><\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"recherche-de-la-position-des-points-decimaux\">Recherche de la position des points d\u00e9cimaux<\/h5>\n\n\n\n<p>Il reste \u00e0 trouver la position des points d\u00e9cimaux.<\/p>\n\n\n\n<p>Pour le HCHO, le pixel 104, 220. Comme la valeur du HCHO sur cet appareil se situe entre 0 et 1.999, il n&rsquo;y a qu&rsquo;une position pour le point d\u00e9cimal.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    # HCHO maximum = 1.999\n    HCHO_dot1 = mask[104: 109:, 220: 226]\n    cv2.imshow(\"HCHO_dot1\", HCHO_dot1)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/setup-alignement_dot-HCHO-1.jpg\" alt=\"\" class=\"wp-image-4560\" width=\"61\" height=\"19\"\/><\/figure><\/div>\n\n\n\n<p><br><br>Pour le TVOC, sa valeur se situe entre 0 et 12, il y a deux positions possibles pour le point d\u00e9cimal.<\/p>\n\n\n\n<p>Premi\u00e8re position du point d\u00e9cimal TVOC, pixel y=162, x=220  et pour la deuxi\u00e8me position, pixel y=162, x=272<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    # TVOC maximum = 12\n    TVOC_dot1 = mask[162: 168:, 220: 226]\n    cv2.imshow(\"TVOC_dot1\", TVOC_dot1)\n    \n    TVOC_dot2 = mask[162: 168:, 272: 278]\n    cv2.imshow(\"TVOC_dot2\", TVOC_dot2)<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/setup-alignement_pd-TVOC-1.jpg\" alt=\"\" class=\"wp-image-4561\" width=\"144\" height=\"20\"\/><\/figure><\/div>\n\n\n\n<p>Il n&rsquo;y a pas de point d\u00e9cimal pour les autres mesures; PM2.5, PM10, Co2.<br><br>Vue globale sur l&rsquo;\u00e9cran de l&rsquo;ordinateur<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/aligne_00-1024x681.jpg\" alt=\"\" class=\"wp-image-4562\" width=\"512\" height=\"341\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/aligne_00-1024x681.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/aligne_00-300x199.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/aligne_00-768x511.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/aligne_00-1536x1021.jpg 1536w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/aligne_00.jpg 1593w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p><br><br>Le mot \u00abdigit\u00bb sera employ\u00e9 dans la suite plut\u00f4t que \u00abchiffre\u00bb pour r\u00e9f\u00e9rer \u00e0 l&rsquo;ensemble des 7 segments qui composent un chiffre. Cela a pour but de diff\u00e9rentier entre chiffre la valeur 0,1,2,3,4,5,6,7,8,9 et chiffre en tant qu&rsquo;unit\u00e9, dizaine, centaine&#8230;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Assignement m\u00e9moire pour 5 nombres de 4 \u00abdigits\u00bb\nnumber=np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]])\n\n    # Position en y (ligne) du premier pixel de chaque nombre\n    posNumber=np.array([69,127,186,246,305])\n    # Position en x (col) du premier pixel de chaque \u00abdigit\u00bb\n    posDigit=np.array([185,239,289,340])<\/pre>\n\n\n\n<p>La position en x du premier pixel de chaque \u00abdigit\u00bb est d\u00e9termin\u00e9e encore par essais-erreurs.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"la-partie-reseau-de-neurones\">La partie \u00abr\u00e9seau de neurones\u00bb<\/h5>\n\n\n\n<p>Deux boucles sont imbriqu\u00e9es pour retrouver chaque \u00abdigit\u00bb de chaque nombre qui correspond \u00e0 une mesure.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    for m in range(0, 5): # 5 Nombres (position 0,1,2,3,4)\n        line=posNumber[m]\n        for j in range(0, 4): # 4 \u00abdigits\u00bb (position 0,1,2,3)\n            col=posDigit[j]<\/pre>\n\n\n\n<p>Chaque \u00abdigit\u00bb est compos\u00e9 de 7 segments. Les segments sont allum\u00e9s selon le chiffre \u00e0 afficher.<\/p>\n\n\n\n<p>Chaque segment est analys\u00e9 selon l&rsquo;\u00e9tat de 4 pixels qui en font parti. Les segments sont nomm\u00e9s a,b,c,d,e,f,g.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"430\" height=\"557\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive7b.jpg\" alt=\"\" class=\"wp-image-4536\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive7b.jpg 430w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Diapositive7b-232x300.jpg 232w\" sizes=\"(max-width: 430px) 100vw, 430px\" \/><\/figure>\n\n\n\n<p><br><br>Le pixel nomm\u00e9 a1 vaut 1 s&rsquo;il est noir ( == 0) sur le mask sinon il vaut -1 <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">            # un pixel blanc sur le mask a comme valeur 255\n            # un pixel noir sur le mask a comme valeur 0\n            a1 = 1 if mask[line+1,col+9]== 0 else -1<\/pre>\n\n\n\n<p>Quatre pixels de chaque segment sont \u00e9valu\u00e9s pour \u00e9viter une fausse lecture si un pixel est brouill\u00e9 par une poussi\u00e8re, un probl\u00e8me de cam\u00e9ra, de transmission, etc. <strong>C&rsquo;est l&rsquo;avantage du r\u00e9seau de neurones, la lecture des chiffres est possible m\u00eame si une partie de l&rsquo;information est erron\u00e9e.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    # Assignement m\u00e9moire pour 5 nombres de 4 \u00abdigits\u00bb\n    number=np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]])\n    \n    # Position en y (ligne) du premier pixel de chaque nombre\n    posNumber=np.array([69,127,186,246,305])\n    # Position en x (col) du premier pixel de chaque \u00abdigit\u00bb\n    posDigit=np.array([185,239,289,340])\n\n    for m in range(0, 5): # 5 Nombres (position 0,1,2,3,4)\n        line=posNumber[m]\n        for j in range(0, 4): # 4 \u00abdigits\u00bb (position 0,1,2,3)\n            col=posDigit[j]\n\n            # un pixel blanc sur le mask a comme valeur 255\n            # un pixel noir sur le mask a comme valeur 0\n            a1 = 1 if mask[line+1,col+9]    == 0 else -1\n            a2 = 1 if mask[line+1,col+10]   == 0 else -1\n            a3 = 1 if mask[line+1,col+11]   == 0 else -1\n            a4 = 1 if mask[line+1,col+12]   == 0 else -1\n<\/pre>\n\n\n\n<p>La position du pixel a1, du segment a, du premier nombre (HCH0), premier \u00abdigit\u00bb se calcul ainsi:<\/p>\n\n\n\n<p><strong>line<\/strong> = <strong>posNumber[0]<\/strong> \u00e9gal <strong>69<\/strong> ; <strong>col<\/strong>=<strong>posDigit[0]<\/strong> \u00e9gal <strong>185<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mask[line+1,col+9]<\/pre>\n\n\n\n<p>donc dans le mask[69+1,185+9], soit mask[ligne 70, colonne194]<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">            a1 = 1 if mask[line+1,col+9]== 0 else -1<\/pre>\n\n\n\n<p><br><br>Chaque segment est \u00e9valu\u00e9<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">            a1 = 1 if mask[line+1,col+9]    == 0 else -1\n            a2 = 1 if mask[line+1,col+10]   == 0 else -1\n            a3 = 1 if mask[line+1,col+11]   == 0 else -1\n            a4 = 1 if mask[line+1,col+12]   == 0 else -1\n\n    \n            b1 = 1 if mask[line+7,col+20]   == 0 else -1\n            b2 = 1 if mask[line+8,col+20]   == 0 else -1\n            b3 = 1 if mask[line+9,col+20]   == 0 else -1\n            b4 = 1 if mask[line+10,col+20]  == 0 else -1\n\n    \n            c1 = 1 if mask[line+27,col+20]  == 0 else -1\n            c2 = 1 if mask[line+28,col+20]  == 0 else -1\n            c3 = 1 if mask[line+29,col+20]  == 0 else -1\n            c4 = 1 if mask[line+30,col+20]  == 0 else -1   \n           \n    \n            d1 = 1 if mask[line+37,col+9]   == 0 else -1\n            d2 = 1 if mask[line+37,col+10]  == 0 else -1\n            d3 = 1 if mask[line+37,col+11]  == 0 else -1\n            d4 = 1 if mask[line+37,col+12]  == 0 else -1\n\n    \n            e1 = 1 if mask[line+27,col+0]   == 0 else -1\n            e2 = 1 if mask[line+28,col+0]   == 0 else -1\n            e3 = 1 if mask[line+29,col+0]   == 0 else -1\n            e4 = 1 if mask[line+30,col+0]   == 0 else -1\n           \n    \n            f1 = 1 if mask[line+7,col+0]    == 0 else -1\n            f2 = 1 if mask[line+8,col+0]    == 0 else -1\n            f3 = 1 if mask[line+9,col+0]    == 0 else -1\n            f4 = 1 if mask[line+10,col+0]   == 0 else -1\n           \n    \n            g1 = 1 if mask[line+18,col+9]   == 0 else -1\n            g2 = 1 if mask[line+18,col+10]  == 0 else -1\n            g3 = 1 if mask[line+18,col+11]  == 0 else -1\n            g4 = 1 if mask[line+18,col+12]  == 0 else -1<\/pre>\n\n\n\n<p><br><br>La somme de la valeur trouv\u00e9e pour chaque pixel pour chaque segment est calcul\u00e9e. Cette somme sera donc comprise entre 4 et -4.  <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">            sa=a1+a2+a3+a4 # Segment a\n            sb=b1+b2+b3+b4 # Segment b\n            sc=c1+c2+c3+c4 # Segment c\n            sd=d1+d2+d3+d4 # Segment d\n            se=e1+e2+e3+e4 # Segment e\n            sf=f1+f2+f3+f4 # Segment f\n            sg=g1+g2+g3+g4 # Segment g<\/pre>\n\n\n\n<p><br><br>La valeur de sortie de chaque neurone est calcul\u00e9e. Exemple pour le neurone \u00ab1\u00bb, il faut additionner la valeur des segments \u00abb\u00bb et \u00abc\u00bb.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">            # Assignement m\u00e9moire pour chaque chiffre \u00e0 repr\u00e9senter\n            r=np.array([0,1,2,3,4,5,6,7,8,9])\n    \n            r[0]=sa+sb+sc+sd+se+sf         # valeur de sortie du neurone \u00ab0\u00bb\n            r[1]=sb+sc                     # valeur de sortie du neurone \u00ab1\u00bb\n            r[2]=sa+sb+sg+se+sd            # valeur de sortie du neurone \u00ab2\u00bb\n            r[3]=sa+sb+sg+sc+sd            # valeur de sortie du neurone \u00ab3\u00bb\n            r[4]=sb+sc+sf+sg               # valeur de sortie du neurone \u00ab4\u00bb\n            r[5]=sa+sf+sg+sc+sd            # valeur de sortie du neurone \u00ab5\u00bb\n            r[6]=sa+sf+sg+se+sd+sc         # valeur de sortie du neurone \u00ab6\u00bb\n            r[7]=sa+sb+sc                  # valeur de sortie du neurone \u00ab7\u00bb\n            r[8]=sa+sb+sc+sd+se+sf+sg      # valeur de sortie du neurone \u00ab8\u00bb\n            r[9]=sa+sb+sc+sd+sf+sg         # valeur de sortie du neurone \u00ab9\u00bb<\/pre>\n\n\n\n<p><br><br>Prochaine \u00e9tape, il faut trouver la valeur maximum<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> mx=max(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9])<\/pre>\n\n\n\n<p><br><br>Il reste \u00e0 trouver qui poss\u00e8de la valeur maximum<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">            for i in range(0, 10):\n                if r[i] == mx: break\n        \n            number[m,j]=i<\/pre>\n\n\n\n<p><strong>La valeur de i correspond au num\u00e9ro du neurone qui a la valeur maximum de sortie. Le chiffre du \u00abdigit\u00bb trait\u00e9 correspond au num\u00e9ro de neurone.<\/strong> Par exemple number[m,j]=i, si m=1, j=3 et i=7, number[1,3]=7,  m=1 correspond \u00e0 TVOC, j  \u00e0 la position du dernier \u00abdigit\u00bb, celui compl\u00e8tement \u00e0 droite, sa valeur affich\u00e9e est 7.<\/p>\n\n\n\n<p><br><br><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"detection-de-la-position-du-point-decimal-pour-tvoc\">D\u00e9tection de la position du point d\u00e9cimal pour TVOC <\/h5>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        if m == 1:\n \n            tvocD1a = 1 if mask[166,222]  == 0 else -1\n            tvocD1b = 1 if mask[166,223]  == 0 else -1\n            tvocD1c = 1 if mask[167,222]  == 0 else -1\n            tvocD1d = 1 if mask[167,223]  == 0 else -1\n            \n            tvocD1 = tvocD1a+tvocD1b+tvocD1c+tvocD1d\n            \n            \n            tvocD2a = 1 if mask[166,274]  == 0 else -1\n            tvocD2b = 1 if mask[166,274]  == 0 else -1\n            tvocD2c = 1 if mask[167,275]  == 0 else -1\n            tvocD2d = 1 if mask[167,275]  == 0 else -1\n            \n\n            tvocD2 = tvocD2a+tvocD2b+tvocD2c+tvocD2d<\/pre>\n\n\n\n<p><br><br><\/p>\n\n\n\n<p>Impression du nombre trouv\u00e9 dans la console Python. Attente de 1 seconde (1000 millisecondes) avant de traiter une autre capture de la cam\u00e9ra. Sortir de la boucle si la touche \u00abesc\u00bb, key==27, est appuy\u00e9e. Terminaison de la capture et fermeture des fen\u00eatres.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        print(number[m])\n        \n    key = cv2.waitKey(1000)\n    if key == 27:\n        break\n \ncap.release()\ncv2.destroyAllWindows()\n <\/pre>\n\n\n\n<p><br><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"programme-complet\">Programme complet<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># -*- coding: utf-8 -*-\n\"\"\"\n Cr\u00e9er le 2022-02-03\n\n@auteur: Richard Morel\n\nAir Quality Monitor\n\n\"\"\"\n\nimport time\n\nimport cv2\nimport numpy as np\n\n\n    \n # D\u00e9fini le port de capture vid\u00e9o   \ncap = cv2.VideoCapture(0)\n\n# Lecture en boucle de l'image vid\u00e9o\nwhile True:\n    time.sleep(1)\n    _, frame = cap.read()\n    #print(frame.shape)\n\n    # Conversion de l'image RGB en HSV\n    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\n    \n    lower_blue = np.array([38, 112, 87])\n    upper_blue = np.array([179, 255, 255])\n    \n    mask = cv2.inRange(hsv, lower_blue, upper_blue)\n    \n    cv2.imshow(\"Frame\", frame)\n    cv2.imshow(\"Mask\", mask)\n    \n    \n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    crop_img = source[y: y+h, x: x+w]\n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    colFin=480\n        \n    HCHO = mask[69: 125:, 185: colFin]\n    cv2.imshow(\"HCHO\", HCHO)\n\n    TVOC = mask[127: 183:, 185: colFin]\n    cv2.imshow(\"TVOC\", TVOC)\n    \n    PM2_5 = mask[186: 242:, 185: colFin]\n    cv2.imshow(\"PM2_5\", PM2_5)\n    \n    PM10 = mask[246: 302:, 185: colFin]\n    cv2.imshow(\"PM10\", PM10)\n    \n    CO2 = mask[304: 360:, 185: colFin]\n    cv2.imshow(\"CO2\", CO2)\n    \n         \n    # HCHO maximum = 1.999\n    HCHO_dot1 = mask[104: 109:, 220: 226]\n    cv2.imshow(\"HCHO_dot1\", HCHO_dot1)\n    \n    # TVOC maximum = 12\n    TVOC_dot1 = mask[162: 168:, 220: 226]\n    cv2.imshow(\"TVOC_dot1\", TVOC_dot1)\n    \n    TVOC_dot2 = mask[162: 168:, 272: 278]\n    cv2.imshow(\"TVOC_dot2\", TVOC_dot2)\n    \n    \n   \n    # Assignement m\u00e9moire pour 5 nombres de 4 \u00abdigits\u00bb\n    number=np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]])\n    \n    # Position en y (ligne) du premier pixel de chaque nombre\n    posNumber=np.array([69,127,186,246,305])\n    # Position en x (col) du premier pixel de chaque \u00abdigit\u00bb\n    posDigit=np.array([185,239,289,340])\n\n\n    print('-')\n    for m in range(0, 5): # 5 Nombres (position 0,1,2,3,4)\n        line=posNumber[m]\n        for j in range(0, 4): # 4 \u00abdigits\u00bb (position 0,1,2,3)\n            col=posDigit[j]\n            #print(col)\n            #print(line)\n            # un pixel blanc sur le mask a comme valeur 255\n            # un pixel noir sur le mask a comme valeur 0\n            a1 = 1 if mask[line+1,col+9]    == 0 else -1\n            a2 = 1 if mask[line+1,col+10]   == 0 else -1\n            a3 = 1 if mask[line+1,col+11]   == 0 else -1\n            a4 = 1 if mask[line+1,col+12]   == 0 else -1\n\n    \n            b1 = 1 if mask[line+7,col+20]   == 0 else -1\n            b2 = 1 if mask[line+8,col+20]   == 0 else -1\n            b3 = 1 if mask[line+9,col+20]   == 0 else -1\n            b4 = 1 if mask[line+10,col+20]  == 0 else -1\n\n    \n            c1 = 1 if mask[line+27,col+20]  == 0 else -1\n            c2 = 1 if mask[line+28,col+20]  == 0 else -1\n            c3 = 1 if mask[line+29,col+20]  == 0 else -1\n            c4 = 1 if mask[line+30,col+20]  == 0 else -1   \n           \n    \n            d1 = 1 if mask[line+37,col+9]   == 0 else -1\n            d2 = 1 if mask[line+37,col+10]  == 0 else -1\n            d3 = 1 if mask[line+37,col+11]  == 0 else -1\n            d4 = 1 if mask[line+37,col+12]  == 0 else -1\n\n    \n            e1 = 1 if mask[line+27,col+0]   == 0 else -1\n            e2 = 1 if mask[line+28,col+0]   == 0 else -1\n            e3 = 1 if mask[line+29,col+0]   == 0 else -1\n            e4 = 1 if mask[line+30,col+0]   == 0 else -1\n           \n    \n            f1 = 1 if mask[line+7,col+0]    == 0 else -1\n            f2 = 1 if mask[line+8,col+0]    == 0 else -1\n            f3 = 1 if mask[line+9,col+0]    == 0 else -1\n            f4 = 1 if mask[line+10,col+0]   == 0 else -1\n           \n    \n            g1 = 1 if mask[line+18,col+9]   == 0 else -1\n            g2 = 1 if mask[line+18,col+10]  == 0 else -1\n            g3 = 1 if mask[line+18,col+11]  == 0 else -1\n            g4 = 1 if mask[line+18,col+12]  == 0 else -1\n\n\n    \n    \n            sa=a1+a2+a3+a4 # Segment a\n            sb=b1+b2+b3+b4 # Segment b\n            sc=c1+c2+c3+c4 # Segment c\n            sd=d1+d2+d3+d4 # Segment d\n            se=e1+e2+e3+e4 # Segment e\n            sf=f1+f2+f3+f4 # Segment f\n            sg=g1+g2+g3+g4 # Segment g\n            \n    \n            # Assignement m\u00e9moire pour chaque \u00abdigit\u00bb \u00e0 repr\u00e9senter\n            r=np.array([0,1,2,3,4,5,6,7,8,9])\n    \n            r[0]=sa+sb+sc+sd+se+sf         # valeur de sortie du neurone \u00ab0\u00bb\n            r[1]=sb+sc                     # valeur de sortie du neurone \u00ab1\u00bb\n            r[2]=sa+sb+sg+se+sd            # valeur de sortie du neurone \u00ab2\u00bb\n            r[3]=sa+sb+sg+sc+sd            # valeur de sortie du neurone \u00ab3\u00bb\n            r[4]=sb+sc+sf+sg               # valeur de sortie du neurone \u00ab4\u00bb\n            r[5]=sa+sf+sg+sc+sd            # valeur de sortie du neurone \u00ab5\u00bb\n            r[6]=sa+sf+sg+se+sd+sc         # valeur de sortie du neurone \u00ab6\u00bb\n            r[7]=sa+sb+sc                  # valeur de sortie du neurone \u00ab7\u00bb\n            r[8]=sa+sb+sc+sd+se+sf+sg      # valeur de sortie du neurone \u00ab8\u00bb\n            r[9]=sa+sb+sc+sd+sf+sg         # valeur de sortie du neurone \u00ab9\u00bb\n    \n            mx=max(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9])\n            #print (mx)\n    \n            for i in range(0, 10):\n                if r[i] == mx: break\n        \n            number[m,j]=i\n            \n            #\n            # HCHO_dot1 = mask[104: 109:, 220: 225]\n            #\n\n        if m == 1:\n \n            tvocD1a = 1 if mask[166,222]  == 0 else -1\n            tvocD1b = 1 if mask[166,223]  == 0 else -1\n            tvocD1c = 1 if mask[167,222]  == 0 else -1\n            tvocD1d = 1 if mask[167,223]  == 0 else -1\n            \n            tvocD1 = tvocD1a+tvocD1b+tvocD1c+tvocD1d\n            \n            \n            tvocD2a = 1 if mask[166,274]  == 0 else -1\n            tvocD2b = 1 if mask[166,274]  == 0 else -1\n            tvocD2c = 1 if mask[167,275]  == 0 else -1\n            tvocD2d = 1 if mask[167,275]  == 0 else -1\n            \n\n            tvocD2 = tvocD2a+tvocD2b+tvocD2c+tvocD2d\n            \n            \n            print(tvocD1)\n            print(tvocD2)\n\n            \n        print(number[m])\n     \n\n    key = cv2.waitKey(100)\n    #(curseur dans une des imshow)\n    if key == 27:\n        break\n  \n\ncap.release()\ncv2.destroyAllWindows()\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"essais\">Essais<\/h2>\n\n\n\n<p>Il faut v\u00e9rifier que chaque \u00abdigit\u00bb est bien d\u00e9cod\u00e9 pour les valeurs de 0 \u00e0 9. Le truc rapide est de faire \u00ab inhaler \u00bb un peu de Purel au d\u00e9tecteur ou souffler sur la flamme d&rsquo;une chandelle pr\u00e8s du d\u00e9tecteur.  Les \u00abdigits\u00bb HCH0, TVOC passe par tous les chiffres \u00e9ventuellement. C&rsquo;est quand m\u00eame un bon test pour le Co2 et les autres.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"577\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/validation_02-1024x577.jpg\" alt=\"\" class=\"wp-image-4687\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/validation_02-1024x577.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/validation_02-300x169.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/validation_02-768x432.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/validation_02-1536x865.jpg 1536w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/validation_02.jpg 1909w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"programme-incluant-l-ecriture-des-donnees-sur-disque\">Programme incluant l&rsquo;\u00e9criture des donn\u00e9es sur disque<\/h2>\n\n\n\n<p>Comme l&rsquo;image peut tout de m\u00eame \u00eatre d\u00e9form\u00e9e par la cam\u00e9ra (les \u00abdigits\u00bb n&rsquo;ont pas exactement la m\u00eame dimension et le m\u00eame espacement), il est pr\u00e9f\u00e9rable de trouver la position exacte de chaque \u00abdigit\u00bb par essais-erreurs et de modifier le programme en cons\u00e9quence.<\/p>\n\n\n\n<p>La cam\u00e9ra a \u00e9t\u00e9 boug\u00e9e, donc les rep\u00e8res initiaux sont aussi modifi\u00e9s. Les changements importants sont :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">posDigit=np.array([[186,236,285,335],[186,234,284,334],[185,235,285,335],[185,235,283,332],[184,233,283,334]])<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">col=posDigit[m,j]<\/pre>\n\n\n\n<p>Vue globale du d\u00e9but de la boucle<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    # Assignement m\u00e9moire pour 5 nombres de 4 \u00abdigits\u00bb\n    number=np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]])\n    \n    # Position en y (ligne) du premier pixel de chaque nombre\n    posNumber=np.array([70,125,181,238,294])\n    # Position en x (col) du premier pixel de chaque \u00abdigit\u00bb\n    posDigit=np.array([[186,236,285,335],\n                       [186,234,284,334],\n                       [185,235,285,335],\n                       [185,235,283,332],\n                       [184,233,283,334]])\n\n\n    print('-')\n    for m in range(0, 5): # 5 Nombres (position 0,1,2,3,4)\n        line=posNumber[m]\n        for j in range(0, 4): # 4 \u00abdigits\u00bb (position 0,1,2,3)\n            col=posDigit[m,j]<\/pre>\n\n\n\n<p><br><br>Les donn\u00e9es lues seront \u00e9crites dans un fichier \u00ab.txt\u00bb. Le \u00ab ; \u00bb sert de d\u00e9limiteur entre les donn\u00e9es dans le fichier texte. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DATA_PATH = \"C:\/Documents\/Programmation\/Python\/Travail\/analyse d image\/\"\ndataFileName = DATA_PATH + \"dataDir_00\/dataFile_00.txt\" \ndataFile = open(dataFileName, 'a')  #mode \u00abappend\u00bb, ajout\n\n#Ent\u00eate des colonnes\ndataFile.write('Date;'+'Heure;'+'HCHO;'+'HCHO;'+'TVOC;'+'TVOC;'+'PM2.5;'\n               +'PM2.5;'+'PM10;'+'PM10;'+'Co2;'+'Co2;'+'\\r')<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"nouveaux-masks-d-essais\">Nouveaux \u00abmasks\u00bb d&rsquo;essais<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"628\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/align-carac_04-1024x628.jpg\" alt=\"\" class=\"wp-image-4667\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/align-carac_04-1024x628.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/align-carac_04-300x184.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/align-carac_04-768x471.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/align-carac_04-1536x941.jpg 1536w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/align-carac_04.jpg 1839w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p><br><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"programme-complet-incluant-l-ecriture-des-donnees-sur-disque\">Programme complet incluant l&rsquo;\u00e9criture des donn\u00e9es sur disque<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># -*- coding: utf-8 -*-\n\"\"\"\n Cr\u00e9er le 2022-02-03\n\n@auteur: Richard Morel\n     \n    Lecture de l'affichage du senseur de qualit\u00e9 de l'air\n\n    Air Quality Monitor Rechargeable\n    JSM-131 SE\n \n    Camera\n    ELP-USBFHD01M-MFV\n    \n    # HCHO maximum = 1.999\n    # TVOC maximum = 12\n \n\"\"\"\n\nimport time\nimport datetime\n\nimport cv2\nimport numpy as np\n\nDATA_PATH = \"C:\/Documents\/Programmation\/Python\/Travail\/analyse d image\/\"\ndataFileName = DATA_PATH + \"dataDir_00\/dataFile_00.txt\" \ndataFile = open(dataFileName, 'a')  #mode \u00abappend\u00bb, ajout\n\n#Ent\u00eate des colonnes\ndataFile.write('Date;'+'Heure;'+'HCHO;'+'HCHO;'+'TVOC;'+'TVOC;'+'PM2.5;'\n               +'PM2.5;'+'PM10;'+'PM10;'+'Co2;'+'Co2;'+'\\r')\n   \ncap = cv2.VideoCapture(0)\n\n\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n        \n    Lecture de l'affichage du JSM-131 SE\n\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\" \n\nwhile True:\n    _, frame = cap.read()\n    # print(frame.shape)\n\n    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\n    \n    \n    lower_blue = np.array([38, 112, 87])\n    upper_blue = np.array([179, 255, 255])\n    \n    mask = cv2.inRange(hsv, lower_blue, upper_blue)\n    \n    cv2.imshow(\"Frame\", frame)\n    cv2.imshow(\"Mask\", mask)\n    \n    \n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    crop_img = source[y: y+h, x: x+w]\n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    colFin=480\n    \n    # HCHO\n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    ligne 69: l+h= 69+42, colonne 186: 480\n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"   \n    HCHO = mask[69: 111:, 186: 480]\n    cv2.imshow(\"HCHO\", HCHO)\n    \n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    ligne 69: l+h= 69+42, colonne 186: c+26\n    \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n    \n    g=21\n    d=38\n    HCHO1 = mask[69: 111:, 186: 212]\n    cv2.imshow(\"HCHO1\", HCHO1)\n    \n    HCHO2 = mask[69: 111:, 236: 260]\n    cv2.imshow(\"HCHO2\", HCHO2)\n    \n    HCHO3 = mask[69: 111:, 285: 310]\n    cv2.imshow(\"HCHO3\", HCHO3)\n    \n    HCHO4 = mask[69: 111:, 335: 358]\n    cv2.imshow(\"HCHO4\", HCHO4)\n    \n    HCHO4g = mask[69+g: 111:, 186: 358]\n    cv2.imshow(\"HCHO4g\", HCHO4g)\n    \n    HCHO4d = mask[69+d: 111:, 335: 358]\n    cv2.imshow(\"HCHO4d\", HCHO4d)\n    \n        \n    \n    # TVOC\n    TVOC = mask[125: 167:, 186: colFin]\n    cv2.imshow(\"TVOC\", TVOC)\n    \n    TVOC1 = mask[125: 167:, 186: 210]\n    cv2.imshow(\"TVOC1\", TVOC1)\n    \n    TVOC2 = mask[125: 167:, 234: 260]\n    cv2.imshow(\"TVOC2\", TVOC2)\n    \n    TVOC3 = mask[125: 167:, 284: 308]\n    cv2.imshow(\"TVOC3\", TVOC3)\n    \n    TVOC4 = mask[125: 167:, 334: 358]\n    cv2.imshow(\"TVOC4\", TVOC4)\n    \n    TVOC4g = mask[125+g: 167:, 186: 358]\n    cv2.imshow(\"TVOC4g\", TVOC4g)    \n    \n    TVOC4d = mask[125+d: 167:, 334: 358]\n    cv2.imshow(\"TVOC4d\", TVOC4d)\n    \n        \n    \n    \n    PM2_5 = mask[181: 223:, 185: colFin]\n    cv2.imshow(\"PM2_5\", PM2_5)\n    \n    PM2_5_1 = mask[181: 223:, 185: 210]\n    cv2.imshow(\"PM2_5_1\", PM2_5_1)\n    \n    PM2_5_2 = mask[181: 223:, 235: 258]\n    cv2.imshow(\"PM2_5_2\", PM2_5_2)\n    \n    PM2_5_3 = mask[181: 223:, 285: 308]\n    cv2.imshow(\"PM2_5_3\", PM2_5_3)\n    \n    PM2_5_4 = mask[181: 223:, 335: 358]\n    cv2.imshow(\"PM2_5_4\", PM2_5_4)\n    \n    PM2_5_4g = mask[181+g: 223:, 185: 358]\n    cv2.imshow(\"PM2_5_4g\", PM2_5_4g)\n\n    PM2_5_4d = mask[181+d: 223:, 335: 358]\n    cv2.imshow(\"PM2_5_4d\", PM2_5_4d)\n    \n        \n    \n    PM10 = mask[238: 281:, 185: colFin]\n    cv2.imshow(\"PM10\", PM10)\n    \n    PM10_1 = mask[238: 281:, 185: 208]\n    cv2.imshow(\"PM10_1\", PM10_1)\n    \n    PM10_2 = mask[238: 281:, 235: 258]\n    cv2.imshow(\"PM10_2\", PM10_2)\n    \n    PM10_3 = mask[238: 281:, 283: 308]\n    cv2.imshow(\"PM10_3\", PM10_3)\n    \n    PM10_4 = mask[238: 281:, 332: 358]\n    cv2.imshow(\"PM10_4\", PM10_4)  \n    \n    PM10_4g = mask[238+g: 281:, 185: 358]\n    cv2.imshow(\"PM10_4g\", PM10_4g) \n\n    PM10_4d = mask[238+d: 281:, 332: 358]\n    cv2.imshow(\"PM10_4d\", PM10_4d) \n    \n\n\n\n    CO2 = mask[294: 336:, 184: colFin]\n    cv2.imshow(\"CO2\", CO2)\n    \n    CO2_1 = mask[294: 336:, 184: 208]\n    cv2.imshow(\"CO2_1\", CO2_1)\n    \n    CO2_2 = mask[294: 336:, 233: 258]\n    cv2.imshow(\"CO2_2\", CO2_2)\n\n    CO2_3 = mask[294: 336:, 283: 308]\n    cv2.imshow(\"CO2_3\", CO2_3)\n\n    CO2_4 = mask[294: 336:, 333: 357]\n    cv2.imshow(\"CO2_4\", CO2_4)   \n    \n    CO2_4g = mask[294+g: 336:, 184: 357]\n    cv2.imshow(\"CO2_4g\", CO2_4g)      \n    \n    CO2_4d = mask[294+d: 336:, 333: 357]\n    cv2.imshow(\"CO2_4d\", CO2_4d)  \n    \n         \n    \n    # HCHO maximum = 1.999\n    HCHO_dot1 = mask[103: 109:, 220: 226]\n    cv2.imshow(\"HCHO_dot1\", HCHO_dot1)\n    \n    # TVOC maximum = 12\n    TVOC_dot1 = mask[159: 168:, 220: 226]\n    cv2.imshow(\"TVOC_dot1\", TVOC_dot1)\n    \n    TVOC_dot2 = mask[159: 168:, 271: 277]\n    cv2.imshow(\"TVOC_dot2\", TVOC_dot2)\n    \n\n \n    # Assignement m\u00e9moire pour 5 nombres de 4 \u00abdigits\u00bb\n    number=np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]])\n    \n    # Position en y (ligne) du premier pixel de chaque nombre\n    posNumber=np.array([70,125,181,238,294])\n    # Position en x (col) du premier pixel de chaque \u00abdigit\u00bb\n    posDigit=np.array([[186,236,285,335],\n                       [186,234,284,334],\n                       [185,235,285,335],\n                       [185,235,283,332],\n                       [184,233,283,334]])\n\n\n    print('-')\n    for m in range(0, 5): # 5 Nombres (position 0,1,2,3,4)\n        line=posNumber[m]\n        for j in range(0, 4): # 4 \u00abdigits\u00bb (position 0,1,2,3)\n            col=posDigit[m,j]\n            #print(line)\n            #print(col)\n\n            # un pixel blanc sur le mask a comme valeur 255\n            # un pixel noir sur le mask a comme valeur 0\n            a1 = 1 if mask[line+1,col+11]   == 0 else -1\n            a2 = 1 if mask[line+1,col+12]   == 0 else -1\n            a3 = 1 if mask[line+1,col+13]   == 0 else -1\n            a4 = 1 if mask[line+1,col+14]   == 0 else -1\n\n    \n            b1 = 1 if mask[line+8,col+22]   == 0 else -1\n            b2 = 1 if mask[line+9,col+22]   == 0 else -1\n            b3 = 1 if mask[line+10,col+22]  == 0 else -1\n            b4 = 1 if mask[line+11,col+22]  == 0 else -1\n\n    \n            c1 = 1 if mask[line+29,col+22]  == 0 else -1\n            c2 = 1 if mask[line+30,col+22]  == 0 else -1\n            c3 = 1 if mask[line+31,col+22]  == 0 else -1\n            c4 = 1 if mask[line+32,col+22]  == 0 else -1   \n           \n    \n            d1 = 1 if mask[line+38,col+11]  == 0 else -1\n            d2 = 1 if mask[line+38,col+12]  == 0 else -1\n            d3 = 1 if mask[line+38,col+13]  == 0 else -1\n            d4 = 1 if mask[line+38,col+14]  == 0 else -1\n\n    \n            e1 = 1 if mask[line+29,col+0]   == 0 else -1\n            e2 = 1 if mask[line+30,col+0]   == 0 else -1\n            e3 = 1 if mask[line+31,col+0]   == 0 else -1\n            e4 = 1 if mask[line+32,col+0]   == 0 else -1\n           \n    \n            f1 = 1 if mask[line+8,col+0]    == 0 else -1\n            f2 = 1 if mask[line+9,col+0]    == 0 else -1\n            f3 = 1 if mask[line+10,col+0]   == 0 else -1\n            f4 = 1 if mask[line+11,col+0]   == 0 else -1\n           \n    \n            g1 = 1 if mask[line+21,col+11]  == 0 else -1\n            g2 = 1 if mask[line+21,col+12]  == 0 else -1\n            g3 = 1 if mask[line+21,col+13]  == 0 else -1\n            g4 = 1 if mask[line+21,col+14]  == 0 else -1\n\n\n    \n    \n            sa=a1+a2+a3+a4 # Segment a\n            sb=b1+b2+b3+b4 # Segment b\n            sc=c1+c2+c3+c4 # Segment c\n            sd=d1+d2+d3+d4 # Segment d\n            se=e1+e2+e3+e4 # Segment e\n            sf=f1+f2+f3+f4 # Segment f\n            sg=g1+g2+g3+g4 # Segment g\n            \n\n    \n            r=np.array([0,1,2,3,4,5,6,7,8,9])\n    \n            r[0]=sa+sb+sc+sd+se+sf         # digit 0\n            r[1]=sb+sc                     # digit 1\n            r[2]=sa+sb+sg+se+sd            # digit 2\n            r[3]=sa+sb+sg+sc+sd            # digit 3\n            r[4]=sb+sc+sf+sg               # digit 4\n            r[5]=sa+sf+sg+sc+sd            # digit 5\n            r[6]=sa+sf+sg+se+sd+sc         # digit 6\n            r[7]=sa+sb+sc                  # digit 7\n            r[8]=sa+sb+sc+sd+se+sf+sg      # digit 8\n            r[9]=sa+sb+sc+sd+sf+sg         # digit 9\n    \n            mx=max(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9])\n            #print (mx)\n    \n            for i in range(0, 10):\n                if r[i] == mx: break\n        \n            number[m,j]=i\n            \n        #print(number[m]) \n        \n        # D\u00e9tection de la position de la virgule pour TVOC\n        if m == 1:   \n            tvocD1a = 1 if mask[162,222]  == 0 else -1\n            tvocD1b = 1 if mask[162,223]  == 0 else -1\n            tvocD1c = 1 if mask[163,222]  == 0 else -1\n            tvocD1d = 1 if mask[163,223]  == 0 else -1\n            \n            tvocD1 = tvocD1a+tvocD1b+tvocD1c+tvocD1d\n            \n            \n            tvocD2a = 1 if mask[162,272]  == 0 else -1\n            tvocD2b = 1 if mask[162,272]  == 0 else -1\n            tvocD2c = 1 if mask[163,273]  == 0 else -1\n            tvocD2d = 1 if mask[163,273]  == 0 else -1\n            \n            tvocD2 = tvocD2a+tvocD2b+tvocD2c+tvocD2d\n            \n            #print(tvocD1)\n            #print(tvocD2)    \n            \n            \n        \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n        \n            Enregistrement des donn\u00e9es dans un fichier\n\n        \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"           \n       \n        \n        # D\u00e9buter les donn\u00e9es par un horodatage\n        if m == 0:\n            timeStamp = datetime.datetime.now()\n            date_time = timeStamp.strftime(\"%Y-%m-%d; %H:%M:%S\")\n            data = date_time + ';'\n        \n        # HCHO\n        if m == 0:\n            # Inclure l'ajout de la virgule pour HVCO\n            stHCHO = str(number[m,0]) + '.' + str(number[m,1]) \\\n            + str(number[m,2]) + str(number[m,3])\n            print(stHCHO)\n            HCHO= float(stHCHO)\n            #print(HCHO)\n            \n            if HCHO >= 0 and HCHO &lt;=1.999:\n                if HCHO >=     0 and HCHO &lt;=  0.080:\n                    quality_HCHO = '***** HCHO Excellent;'\n                if HCHO >= 0.081 and HCHO &lt;=  0.100:\n                    quality_HCHO = '**** HCHO Good;'\n                if HCHO >= 0.101 and HCHO &lt;=  0.200:\n                    quality_HCHO = '*** HCHO Mild;'            \n                if HCHO >= 0.201 and HCHO &lt;=  0.500:\n                    quality_HCHO = '** HCHO Moderate;'             \n                if HCHO >= 0.501 and HCHO &lt;=  1.000:\n                    quality_HCHO = '* HCHO Severe;' \n                if HCHO >= 1.001 and HCHO &lt;=  1.999:\n                    quality_HCHO = 'HCHO Serious;'  \n            else:\n                quality_HCHO = 'HCHO ?;'\n                \n            #print(quality_HCHO)\n            data = data + stHCHO + ';' + quality_HCHO \n            \n            \n        \n        #TVOC\n        if m == 1:\n            stTVOC = str(number[m,0])\n            # ajout conditionnel de la virgule pour TVOC\n            if tvocD1 == 4 and tvocD2 == -4:\n                stTVOC = stTVOC + '.'  \n            stTVOC = stTVOC + str(number[m,1])\n            # ajout conditionnel de la virgule pour TVOC\n            if tvocD2 == 4 and tvocD1 == -4:\n                stTVOC = stTVOC + '.' \n            stTVOC = stTVOC + str(number[m,2])\n            stTVOC = stTVOC + str(number[m,3])\n            print(stTVOC)\n            TVOC= float(stTVOC)\n            #print(TVOC)\n            \n            if TVOC >= 0 and TVOC &lt;=12:\n                if TVOC >=     0 and TVOC &lt;=  0.5:\n                    quality_TVOC = '***** TVOC Excellent;'\n                if TVOC >= 0.501 and TVOC &lt;=  0.6:\n                    quality_TVOC = '**** TVOC Good;'\n                if TVOC >= 0.601 and TVOC &lt;=  1.5:\n                    quality_TVOC = '*** TVOC Mild;'            \n                if TVOC >= 1.501 and TVOC &lt;=  3.0:\n                    quality_TVOC = '** TVOC Moderate;'             \n                if TVOC >= 3.001 and TVOC &lt;=  6.0:\n                    quality_TVOC = '* TVOC Severe;' \n                if TVOC >= 6.001 and TVOC &lt;= 12.0:\n                    quality_TVOC = 'TVOC Serious;'  \n            else:\n                quality_TVOC = 'TVOC ?;'\n                \n            #print(quality_TVOC)\n            data = data + stTVOC + ';' + quality_TVOC  \n         \n        # PM2.5\n        if m == 2:\n            stPM2_5 = str(number[m,0]) + str(number[m,1]) \\\n            + str(number[m,2]) + str(number[m,3])\n            print(stPM2_5)\n            PM2_5= float(stPM2_5)\n            #print(PM2_5)            \n\n            if PM2_5 >= 0 and PM2_5 &lt;=1000:\n                if PM2_5 >=   0 and PM2_5 &lt;=  35:\n                    quality_PM2_5 = '***** PM2.5 Excellent;'\n                if PM2_5 >=  36 and PM2_5 &lt;=  75:\n                    quality_PM2_5 = '**** PM2.5 Good;'\n                if PM2_5 >=  76 and PM2_5 &lt;= 100:\n                    quality_PM2_5 = '*** PM2.5 Mild;'            \n                if PM2_5 >= 101 and PM2_5 &lt;= 150:\n                    quality_PM2_5 = '** PM2.5 Moderate;'             \n                if PM2_5 >= 151 and PM2_5 &lt;= 250:\n                    quality_PM2_5 = '* PM2.5 Severe;' \n                if PM2_5 >= 251 and PM2_5 &lt;=1000:\n                    quality_PM2_5 = 'PM2.5 Serious;'  \n            else:\n                quality_PM2_5 = 'PM2_5 ?;'\n                \n            #print(quality_PM2_5)\n            data = data + stPM2_5 + ';' + quality_PM2_5             \n        \n        # PM10\n        if m == 3:\n            stPM10 = str(number[m,0]) + str(number[m,1]) \\\n            + str(number[m,2]) + str(number[m,3])\n            print(stPM10)\n            PM10= float(stPM10)\n            #print(PM10)\n            \n            if PM10 >= 0 and PM10 &lt;=2000:\n                if PM10 >=   0 and PM10 &lt;=  50:\n                    quality_PM10 = '***** PM10 Excellent;'\n                if PM10 >=  51 and PM10 &lt;= 100:\n                    quality_PM10 = '**** PM10 Good;'\n                if PM10 >= 101 and PM10 &lt;= 130:\n                    quality_PM10 = '*** PM10 Mild;'            \n                if PM10 >= 131 and PM10 &lt;= 200:\n                    quality_PM10 = '** PM10 Moderate;'             \n                if PM10 >= 201 and PM10 &lt;= 300:\n                    quality_PM10 = '* PM10 Severe;' \n                if PM10 >= 301 and PM10 &lt;=2000:\n                    quality_PM10 = 'PM10 Serious;'  \n            else:\n                quality_PM10 = 'PM10 ?;'\n                \n            #print(quality_PM10)\n            data = data + stPM10 + ';' + quality_PM10            \n\n        # Co2\n        if m == 4:\n            stCo2 = str(number[m,0]) + str(number[m,1]) \\\n            + str(number[m,2]) + str(number[m,3])\n            print(stCo2)\n            Co2= float(stCo2)\n            #print(Co2)\n            \n            if Co2 >= 0 and Co2 &lt;=5000:\n                if Co2 >=    0 and Co2 &lt;= 450:\n                    quality_Co2 = '***** Co2 Excellent'\n                if Co2 >=  451 and Co2 &lt;=1000:\n                    quality_Co2 = '**** Co2 Good'\n                if Co2 >= 1001 and Co2 &lt;=1500:\n                    quality_Co2 = '*** Co2 Mild'            \n                if Co2 >= 1501 and Co2 &lt;=2000:\n                    quality_Co2 = '** Co2 Moderate'             \n                if Co2 >= 2001 and Co2 &lt;=3000:\n                    quality_Co2 = '* Co2 Severe' \n                if Co2 >= 3001 and Co2 &lt;=5000:\n                    quality_Co2 = 'Co2 Serious'  \n            else:\n                quality_Co2 = 'Co2 ?'\n                \n            #print(quality_Co2)\n            data = data + stCo2 + ';' + quality_Co2\n                        \n    dataFile.write(data + '\\r')                       \n    data = ''\n    \n    print(quality_HCHO)\n    print(quality_TVOC)\n    print(quality_PM2_5)\n    print(quality_PM10)\n    print(quality_Co2)\n    \n    # en seconde\n    time.sleep(0)\n    \n    # en milliseconde\n    key = cv2.waitKey(100)\n    #(Placer le curseur dans une des imshow)\n    if key == 27:\n        dataFile.close()\n        break\n \n\ncap.release()\ncv2.destroyAllWindows()\n\n<\/pre>\n\n\n\n<p><br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"934\" height=\"717\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Table-de-reference-sur-la-qualite-de-l-air_00.jpg\" alt=\"\" class=\"wp-image-4695\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Table-de-reference-sur-la-qualite-de-l-air_00.jpg 934w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Table-de-reference-sur-la-qualite-de-l-air_00-300x230.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Table-de-reference-sur-la-qualite-de-l-air_00-768x590.jpg 768w\" sizes=\"(max-width: 934px) 100vw, 934px\" \/><figcaption>Le programme inclue les notes \u00e0 allouer aux mesures de la qualit\u00e9 de l&rsquo;air.<\/figcaption><\/figure><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"importation-des-donnees-dans-excel\">Importation des donn\u00e9es dans Excel<\/h2>\n\n\n\n<p>S\u00e9lectionner \u00ab Ouvrir \u00bb, puis parcourir pour aller dans le r\u00e9pertoire du fichier \u00ab .txt \u00bb. <\/p>\n\n\n\n<p>S\u00e9lectionner \u00ab Tous les fichiers (*.*) \u00bb, puis le fichier \u00ab .txt \u00bb.<\/p>\n\n\n\n<p>Suivre les \u00e9tapes 1,2,3<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"713\" height=\"438\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier01.jpg\" alt=\"\" class=\"wp-image-4656\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier01.jpg 713w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier01-300x184.jpg 300w\" sizes=\"(max-width: 713px) 100vw, 713px\" \/><\/figure>\n\n\n\n<p><br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"713\" height=\"438\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier02.jpg\" alt=\"\" class=\"wp-image-4657\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier02.jpg 713w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier02-300x184.jpg 300w\" sizes=\"(max-width: 713px) 100vw, 713px\" \/><\/figure>\n\n\n\n<p><br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"714\" height=\"437\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier03.jpg\" alt=\"\" class=\"wp-image-4658\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier03.jpg 714w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/Presse-papier03-300x184.jpg 300w\" sizes=\"(max-width: 714px) 100vw, 714px\" \/><\/figure>\n\n\n\n<p>S\u00e9lection du point comme s\u00e9parateur d\u00e9cimal, puis Terminer<br><br><\/p>\n\n\n\n<p>R\u00e9sultats avec l&rsquo;option \u00ab Filtrer\u00bb active<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"948\" height=\"625\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01b.jpg\" alt=\"\" class=\"wp-image-4663\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01b.jpg 948w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01b-300x198.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01b-768x506.jpg 768w\" sizes=\"(max-width: 948px) 100vw, 948px\" \/><\/figure>\n\n\n\n<p><br><br><\/p>\n\n\n\n<p>Fonction d&rsquo;insertion de graphiques <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"595\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01-1024x595.jpg\" alt=\"\" class=\"wp-image-4661\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01-1024x595.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01-300x174.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01-768x446.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01-1536x893.jpg 1536w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/02\/resultats-excel_01.jpg 1910w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>En g\u00e9n\u00e9ral, les lectures sont bonnes, mais comme la largeur des segments est mince , le moindre d\u00e9placement ou une vibration peut causer une erreur de lecture. La cam\u00e9ra doit \u00eatre bien centr\u00e9e par rapport \u00e0 l&rsquo;\u00e9cran de l&rsquo;appareil de mesure et bien perpendiculaire verticalement et horizontalement pour r\u00e9duire la d\u00e9formation de l&rsquo;image. Une erreur de lecture peut aussi se produire lors de la lecture d&rsquo;un \u00abdigit\u00bb pendant de sa phase de changement du chiffre. Ces erreurs sont en g\u00e9n\u00e9ral simples \u00e0 d\u00e9tecter, nous les voyons facilement sur les graphiques, elles sortent du lot.<\/p>\n\n\n\n<p>L&rsquo;utilisation du \u00abdeep learning\u00bb augmenterait la pr\u00e9cision de la lecture, le syst\u00e8me serait moins sensible aux d\u00e9formations et vibrations, mais sa mise en oeuvre est plus complexe, elle demande plus de travail. C&rsquo;est une avenue \u00e0 regarder.<\/p>\n\n\n\n<p>En assemblant la cam\u00e9ra et le d\u00e9tecteur de qualit\u00e9 de l&rsquo;air dans un montage rigide, les lectures seraient suffisamment fiables et exploitables. Le r\u00e9seau de neurones artificiel fixe, pr\u00e9d\u00e9terminer, \u00e0 une seule couche est simple \u00e0 mettre en oeuvre pour cette application et rempli son objectif.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>But Le but est de d\u00e9montrer le fonctionnement de base d&rsquo;un r\u00e9seau de neurones artificiels. Cette d\u00e9monstration passe par la lecture de l&rsquo;affichage du d\u00e9tecteur de qualit\u00e9 de l&rsquo;air JSM-131 SE \u00e0 partir d&rsquo;un ordinateur et d&rsquo;une cam\u00e9ra. Les donn\u00e9es captur\u00e9es sont enregistr\u00e9es dans un fichier texte. Le formatage du fichier permettra d&rsquo;importer ces donn\u00e9es [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/4415"}],"collection":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/comments?post=4415"}],"version-history":[{"count":248,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/4415\/revisions"}],"predecessor-version":[{"id":4715,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/4415\/revisions\/4715"}],"wp:attachment":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/media?parent=4415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}