Dernière mise à jour le 05/05/2019

Présentation


Dans ce présent article nous allons voir comment comparer une image (.bmp) qui celle-ci sera enregistré sur la carte SD (Pour ma part je suis muni d’une carte de 16 Giga), le principe est le suivant , c’est de comparer l’image enregistré sur la Carte SD par rapport à ce que la camera OpenMV visualise en instantanée.

Fonctionnement


Au niveau des “Constantes de réglages“, voici celles qui ont été configurées:

import sensor, image, time, os
#Constantes de réglage
gainceiling = 16
constrast = -3
brightness = -3 # Luminosité
saturation = -3
sensor.set_gainceiling(gainceiling)
sensor.set_contrast(constrast)
sensor.set_brightness(brightness)
sensor.set_saturation(saturation)
sensor.set_pixformat(sensor.GRAYSCALE)# film en noir et blanc!
sensor.set_framesize(sensor.QVGA) #320x240
sensor.skip_frames(time = 2000)

Un gain de 16, pas de contrast, pas de luminosité, et pas de saturation. En ce qui concerne le réglage de la caméra, je film en noir et blanc, et avec une résolution de 320×240, nul besoin de rechercher la qualité c’est ce que nous allons voir maintenant!

Dans la programmation je fais appel à la fonction “get_histogram()” qui permet d’obtenir l’histogramme de l’image qui sont résistants à un certain nombre de transformations sur l’image. Ils sont invariants aux rotations et aux translations, et aux changements d’échelle. Les histogrammes sont en revanche sensibles aux changements d’illumination et aux conditions d’éclairage, et c’est pour cette raison que j’ai ajouté la constante “Seuil_reglage“, afin que vous puissiez modifier ce seuil en fonction de la où vous êtes situé (salle obscure, ou plutôt éclaircis pouvant modifier l’image filmé par la caméra OpenMV)


Dans la boucle “While(True)“, je fais une boucle infinie, afin de filmer l’image en temps réel.
Ensuite, pendant que la camera film, je vais ans la foulée prendre une capture de l’image filmé à l’instant “t”, que je sauvegarde dans le dossier “Image”.
Va venir tout de suite après la fonction “difference(“Image/CaptureImage.bmp”)” ou on va faire une différence absolue entre l’image filmé et celle qui a été enregistré sur la carte SD.


C’est ensuite que va intervenir la fonction “get_histogram()”, puis “get_threshold()” et “value()”, ce qui permet:
get_histogram() (Obtenir l’histogramme détaillé précédemment)
get_threshold() (obtenir le seuil et permet de calculer les valeurs de seuil optimales qui divisent l’histogramme en deux moitiés pour chaque canal de l’histogramme)
value() (retourne la valeur du seuil de l’échelle de gris de 0 à 255)


C’est donc avec ces 3 données que nous allons pouvoir faire la différence d’image.

Programmation


# Comparer image bmp – Electronique71.com
import sensor, image, time, os, pyb

Led_Red = pyb.LED(1) # Led rouge

sensor.reset()

#Constantes de réglage
gainceiling = 16
constrast = -3
brightness = -3 # Luminosité
saturation = -3

sensor.set_gainceiling(gainceiling)
sensor.set_contrast(constrast)
sensor.set_brightness(brightness)
sensor.set_saturation(saturation)

sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.QVGA) #320×240
sensor.skip_frames(time = 2000)

Image_Comparer = False
Seuil_reglage = 7 # Valeur du seuil à modifier

if not "Image" in os.listdir(): # Si pas de dossier "Image" sur la carte SD
    os.mkdir("Image") # On créer le dossier "Image"

while(True):

    img = sensor.snapshot()

    if (Image_Comparer == False):   
        print("Sauvegarde Image ")        
        img.save("Image/CaptureImage.bmp")
        Image_Comparer = True


    Img_Diff = img.difference("Image/CaptureImage.bmp")
    Seuil_Valeur = Img_Diff.histogram().get_threshold().value()
    print(Seuil_Valeur)
    
    if (Seuil_Valeur > Seuil_reglage):
        Led_Red.on()  # Led rouge qui s'allume = changement d'image!!
        print('Seuil_Valeur = ' ,Seuil_Valeur)
        time.sleep(1000) # temps pour regarder
        Image_Comparer = False
        Led_Red.off() # On éteint la Led

Prototype



La première image correspond à la superposition de l’image enregistré  et celle filmé par la camera sachant que la différence absolu via la fonction “difference(“Image/CaptureImage.bmp”)” est nul (bien evidemment les 2 images sont identiques alors l’image retourné par la caméra est noir!!)


la deuxième image correspond à l’image d’origine, oui!! désolé je ne vous ai pas dis que je filmais l’écran de mon ordinateur et plus particulièrement le bloc notes!! et à cet instant en cliquant sur l’onglet “Fichier” cela à modifier la différence des 2 images (celle enregistré précédemment et celle visionné par la caméra en temps réel).
Ainsi la différence entre les 2 images n’est plus nul et c’est pour cette raison que la troisième image retourné par la caméra correspond à l’image ou j’ai cliqué…

Prototype



Une petite vidéo de quelque seconde pour voir le fonctionnement.

Historiques


07/05/19
– Ajout d’une led rouge qui s’allume dès que l’image change mais aussi d’une vidéo !
05/05/2019
– 1er mise à disposition