Archives dans 2021

Espaces colorimétriques dans OpenCV | Python

Les espaces colorimétriques sont un moyen de représenter les canaux de couleur présents dans l’image qui donnent à l’image cette teinte particulière. Il existe plusieurs espaces de couleurs différents et chacun a sa propre signification.
Certains des espaces colorimétriques populaires sont RVB (rouge, vert, bleu), CMJN (cyan, magenta, jaune, noir), HSV (teinte, saturation, valeur), etc.

Espace colorimétrique BGR : l’espace colorimétrique par défaut d’OpenCV est RVB. Cependant, il stocke en fait la couleur au format BGR. C’est un modèle de couleur additive où les différentes intensités de bleu, vert et rouge donnent différentes nuances de couleur.

Espace colorimétrique HSV : Il stocke les informations de couleur dans une représentation cylindrique des points de couleur RVB. Il tente de représenter les couleurs telles qu’elles sont perçues par l’œil humain. La valeur de teinte varie de 0 à 179, la valeur de saturation varie de 0 à 255 et la valeur de valeur varie de 0 à 255. Il est principalement utilisé à des fins de segmentation des couleurs.

Espace colorimétrique CMJN : Contrairement au RVB, il s’agit d’un espace colorimétrique soustractif. Le modèle CMJN fonctionne en masquant partiellement ou entièrement les couleurs sur un fond plus clair, généralement blanc. L’encre réduit la lumière qui serait autrement réfléchie. Un tel modèle est dit soustractif car les encres « soustraient » les couleurs rouge, vert et bleu de la lumière blanche. Lumière blanche moins feuilles rouges cyan, lumière blanche moins feuilles vertes magenta et lumière blanche moins feuilles bleues jaunes.

  • YUV : Même si RVB est bon à de nombreuses fins, il a tendanceêtre très limité pour de nombreuses applications réelles. Les gens ont commencé à réfléchir à différentes méthodes pour séparer les informations d’intensité des informations de couleur. Par conséquent, ils ont créé l’espace colorimétrique YUV. Y fait référence à la luminance ou à l’intensité, et les canaux U/V représentent les informations de couleur. Cela fonctionne bien dans de nombreuses applications car le système visuel humain perçoit les informations d’intensité très différemment des informations de couleur.

Visualiser les différents canaux de couleur d’une image RVB:

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0A%20%20%0Aimage%20%3D%20cv2.imread(‘%2Fcontent%2Fprofil.jpeg’)%0Aimage%3Dcv2.cvtColor(image%2C%20cv2.COLOR_BGR2RGB)%0AR%2C%20G%2C%20B%20%3D%20cv2.split(image)%0A%0Afigure(figsize%3D(9%2C6))%0Aplt.subplot(141)%2Cimshow(image)%2Cplt.title(‘Image%20originale’)%0Aplt.axis(‘off’)%0Aplt.subplot(142)%2Cimshow(B)%2Cplt.title(‘Canal%20rouge’)%0Aplt.axis(‘off’)%0Aplt.subplot(143)%2C%20imshow(G)%2C%20plt.title(‘Canal%20vert’)%0Aplt.axis(‘off’)%0Aplt.subplot(144)%2Cimshow(R)%2Cplt.title(‘Canal%20bleu’)%0Aplt.axis(‘off’)” message=”Visualiser les différents canaux de couleur d’une image RVB.” highlight=”” provider=”manual”/]

Nous utilisons la fonction 

cvtColor

pour convertir entre les espaces colorimétriques. Le premier argument est l’image d’entrée et le deuxième argument spécifie la conversion de l’espace colorimétrique. Vous pouvez convertir en YUV en utilisant l’indicateur suivant :

 

image=cv2.cvtColor(image, cv2.COLOR_RGB2YUV)

Voici un exemple  de code permettant de changer l’espace colorimétrique:

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0A%20%20%0Aimage%20%3D%20cv2.imread(‘%2Fcontent%2Fprofil.jpeg’)%0Aimage%3Dcv2.cvtColor(image%2C%20cv2.COLOR_BGR2RGB)%0Aimage1%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2GRAY)%0Aimage2%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2HSV)%0Aimage3%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2XYZ)%0Aimage4%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2YCrCb)%0Aimage5%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2YUV)%0Aimage6%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2Lab)%0Aimage7%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2LUV)%0Afigure(figsize%3D(10%2C8))%0Aplt.subplot(441)%2Cimshow(image)%2Cplt.title(‘Image%20originale’)%0Aplt.axis(‘off’)%0Aplt.subplot(442)%2Cimshow(image1)%2Cplt.title(‘RGB%20vers%20GRAY’)%0Aplt.axis(‘off’)%0Aplt.subplot(443)%2C%20imshow(image2)%2C%20plt.title(‘RGB%20vers%20HSV’)%0Aplt.axis(‘off’)%0Aplt.subplot(444)%2Cimshow(image3)%2Cplt.title(‘RGB%20vers%20XYZ’)%0Aplt.axis(‘off’)%0Aplt.subplot(445)%2Cimshow(image4)%2Cplt.title(‘RGB%20vers%20YCrCb’)%0Aplt.axis(‘off’)%0Aplt.subplot(446)%2Cimshow(image5)%2Cplt.title(‘RGB%20vers%20YUV’)%0Aplt.axis(‘off’)%0Aplt.subplot(447)%2C%20imshow(image6)%2C%20plt.title(‘RGB%20vers%20Lab’)%0Aplt.axis(‘off’)%0Aplt.subplot(448)%2Cimshow(image7)%2Cplt.title(‘RGB%20vers%20LUV’)%0Aplt.axis(‘off’)” message=”” highlight=”” provider=”manual”/]

 

Seuillage adaptatif ou Segmentation adaptative

L’utilisation d’une valeur de seuil globale peut ne pas être un bon choix lorsque l’image a des conditions d’éclairage différentes dans différentes zones. Donc, dans ce cas, nous pouvons vouloir utiliser le seuillage adaptatif. Il utilise l’algorithme qui calcule le seuil pour de petites régions de l’image afin d’

[pastacode lang=”python” manual=”cv2.AdaptiveThreshold(src%2C%20dst%2C%20maxValue%2C%20adaptive_method%3DCV_ADAPTIVE_THRESH_MEAN_C%2C%20thresholdType%3DCV_THRESH_BINARY%2C%20blockSize%3D3%2C%20param1%3D5)%20″ message=”” highlight=”” provider=”manual”/]

obtenir différents seuils pour différentes régions de la même image et il nous donne de meilleurs résultats pour les images avec des conditions d’éclairage variables.

Les éléments  sont:

  1. src – Source image monocanal  8 bits ou image du premier canal en 8 bits.
  2. dst – Image de destination de la même taille et du même type que src.
  3. maxValue – Valeur non nulle attribuée aux pixels pour lesquels la condition est satisfaite.
  4. adaptiveMethod – Algorithme de seuillage adaptatif à utiliser, ADAPTIVE_THRESH_MEAN_C (la valeur seuil est la moyenne de la zone de voisinage) ou ADAPTIVE_THRESH_GAUSSIAN_C (la valeur seuil est la somme pondérée des valeurs de voisinage où les pondérations sont une fenêtre gaussienne). adaptiveMethod décide comment la valeur de seuil est calculée.
  5. thresholdType – le type seuillage qui doit être soit THRESH_BINARY ou THRESH_BINARY_INV.
  6. blockSize – taille d’un voisinage de pixels qui est utilisé pour calculer une valeur de seuil pour le pixel : 3, 5, 7, et ainsi de suite.
  7. C – Constante soustraite de la moyenne ou moyenne pondérée. Normalement, il est positif mais peut également être nul ou négatif. C’est juste une constante qui est soustraite de la moyenne ou moyenne pondérée calculée.

Voici le code  d’un exemple du seuillage adaptatif :

[pastacode lang=”python” manual=”%23%20Importer%20les%20modules%20%0Aimport%20cv2%0Aimport%20numpy%20as%20np%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FClassification%2FComputational%20Imaging%2Fmoi.jpg’%2C0)%0Aimg%20%3D%20cv2.medianBlur(img%2C5)%0A%0Aret%2Cth1%20%3D%20cv2.threshold(img%2C150%2C255%2Ccv2.THRESH_BINARY)%20%23%20binarisation%20%0Ath2%20%3D%20cv2.adaptiveThreshold(img%2C255%2Ccv2.ADAPTIVE_THRESH_MEAN_C%2C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20cv2.THRESH_BINARY%2C15%2C2)%0Ath3%20%3D%20cv2.adaptiveThreshold(img%2C255%2Ccv2.ADAPTIVE_THRESH_GAUSSIAN_C%2C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20cv2.THRESH_BINARY%2C15%2C2)%0A%0Atitles%20%3D%20%5B’%20Image%20original’%2C%20’Seuillage%20global%20(v%20%3D%20150)’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’Seuillage%20moyen%20adaptatif’%2C%20’Seuillage%20gaussien%20adaptatif’%5D%0Aimages%20%3D%20%5Bimg%2C%20th1%2C%20th2%2C%20th3%5D%0A%0Afor%20i%20in%20range(4)%3A%0A%20%20%20%0A%20%20%20%20plt.subplot(2%2C2%2Ci%2B1)%2Cplt.imshow(images%5Bi%5D%2C’gray’)%0A%20%20%20%20plt.title(titles%5Bi%5D)%0A%20%20%20%20plt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0Aplt.show()” message=”Seuillage adaptatif ” highlight=”” provider=”manual”/]

Histogramme des images avec python

Histogramme des images avec python

Alors qu’est-ce que l’histogramme  d’une image? On  peut considérer l’histogramme comme un graphique ou un tracé, ce qui vous donne une idée globale de la distribution d’intensité d’une image. Il s’agit d’un graphique avec des valeurs de pixels (allant de 0 à 255, pas toujours) sur l’axe X et le nombre correspondant de pixels dans l’image sur l’axe Y.

Cette représentation permet de de comprendre l’image. En regardant l’histogramme d’une image, on peut obtenir  une intuition sur le contraste, la luminosité, la distribution d’intensité, etc. de cette image.

À partir de l’histogramme, on peut  voir que la région sombre , la région plus claire, et la  valeurs  du nombre de pixels à un point donné, par exemple à 127.

Calcul d’histogramme en utilisant opencv-python

Vous allons  utiliser la fonction cv2.calcHist() pour trouver l’histogramme de l’image .

On va calculer l’histogramme avec la formule suivante:

cv2.calcHist(images, canaux, masque, histSize, plages[, hist[, accumuler]])

  1. images : c’est l’image source
  2. canaux : il est également indiqué entre crochets. C’est l’indice du canal pour lequel on calcule l’histogramme. Par exemple, si l’entrée est une image en niveaux de gris, sa valeur est [0]. Pour l’image couleur, vous pouvez passer [0],[1] ou [2] pour calculer l’histogramme du canal bleu, vert ou rouge respectivement.
  3. masque : image de masque. Pour trouver l’histogramme de l’image complète, il est donné comme “Aucun”. Mais si vous voulez trouver l’histogramme d’une région particulière de l’image, vous devez créer une image de masque pour cela et la donner comme masque. (Je montrerai un exemple plus tard.)
  4. histSize : cela représente notre nombre de BIN. Doit être indiqué entre crochets. Pour la pleine échelle, nous passons [256].
  5. gammes : c’est notre GAMME. Normalement, c’est [0,256].

Dans notre exemple, nous allons voir comment tracer l’histogramme d’une image sans séparer chaque canal et ensuite comme tracer séparément l’histogramme de chaque canal d’une image couleur(RGB par exemple).

Cas de l’histogramme d’une image couleur ou en niveau de gris

[pastacode lang=”python” manual=”import%20numpy%20as%20np%0Aimport%20cv2%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’)%0Aplt.hist(img.ravel()%2C256%2C%5B0%2C256%5D)%3B%20plt.show()” message=” Calcul d’histogramme dans OpenCV” highlight=”” provider=”manual”/]

Cas de l’histogramme d’une image couleur(RGB) avec séparation de chaque canal

[pastacode lang=”python” manual=”%23%20calcule%20de%20l’histogramme%20par%20Opencv%20sur%20chaque%20canal%0Aimport%20cv2%0Aimport%20numpy%20as%20np%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2C0)%0Aimg1%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2C1)%0Aimg2%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2C2)%0Aplt.subplot(131)%2Cplt.hist(img.ravel()%2C256%2C%5B0%2C256%5D)%2Cplt.title(‘Bleue’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0Aplt.subplot(132)%2Cplt.hist(img1.ravel()%2C256%2C%5B0%2C256%5D)%2Cplt.title(‘vert’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0Aplt.subplot(133)%2Cplt.hist(img.ravel()%2C256%2C%5B0%2C256%5D)%2Cplt.title(‘Rouge’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0A%0Aplt.show()” message=”Histogramme avec chaque canal” highlight=”” provider=”manual”/]

ou

[pastacode lang=”python” manual=”import%20numpy%20as%20np%0Aimport%20cv2%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’)%0Aimg%3D%20%20cv2.cvtColor(img%2Ccv2.COLOR_BGR2RGB)%0A%0Acolor%20%3D%20(‘r’%2C’g’%2C’b’)%0Afor%20i%2Ccol%20in%20enumerate(color)%3A%0A%20%20%20%20histr%20%3D%20cv2.calcHist(%5Bimg%5D%2C%5Bi%5D%2CNone%2C%5B256%5D%2C%5B0%2C256%5D)%0A%20%20%20%20plt.plot(histr%2Ccolor%20%3D%20col)%0A%20%20%20%20plt.xlim(%5B0%2C256%5D)%2Cplt.legend(color)%2Cplt.title(‘Histogramme%20des%20canaux%20R%2C%20G%20B’)%0Aplt.show()%0A” message=”” highlight=”” provider=”manual”/]

Seuillage ou Segmentation d’image avec Opencv-python

Seuillage  ou Segmentation d’image avec Opencv-python

Le seuillage d’image  consiste à remplacer un à un les pixels d’une image à l’aide d’une valeur seuil fixée (par exemple 127). Ainsi, si un pixel à une valeur supérieure au seuil (par exemple 190), il prendra la valeur 255 (blanc), et si sa valeur est inférieure (par exemple 100), il prendra la valeur 0 (noir). On peut dire également que c’est une technique , qui consiste à affecter les valeurs des pixels en fonction de la valeur seuil fournie. Dans le seuillage, chaque valeur de pixel est comparée à la valeur seuil. … Cette technique de seuillage est réalisée sur des images en niveaux de gris.

La valeur du seuil est fixée arbitrairement.

On va donc essayer de voir quelques méthodes de seuillage :

Méthode d’Otsu

La méthode d’Otsu est utilisée pour effectuer un seuillage automatique à partir de la forme de l’histogramme de l’image1, ou la réduction d’une image à niveaux de gris en une image binaire. L’algorithme suppose alors que l’image à binariser ne contient que deux classes de pixels, (c’est-à-dire le premier plan et l’arrière-plan) puis calcule le seuil optimal qui sépare ces deux classes afin que leur variance intra-classe soit minimale2  

threshold est utilisé pour appliquer le seuillage. Le premier argument est l’image source, qui doit être une image en niveaux de gris. Le deuxième argument est la valeur de seuil qui est utilisée pour classer les valeurs de pixel. Le troisième argument est la valeur maximale qui est attribuée aux valeurs de pixels dépassant le seuil.

En termes simples,  le seuillage d’Otsu calcule automatiquement une valeur seuil à partir de l’histogramme d’image pour une image bimodale. (Pour les images qui ne sont pas bimodales, la binarisation ne sera pas précise.)

Image originale:

Voici un exemple de code python :

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0Aima%3Dcv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2Ccv2.COLOR_BGR2RGB)%0A%0Agray%3Dcv2.cvtColor(ima%2C%20cv2.COLOR_BGR2GRAY)%20%23%20convertir%20l’image%20en%20niveau%20de%20gris%0A%0Aret%2C%20thresh_img1%20%3D%20cv2.threshold(gray%2C%20220%2C%20255%2C%20cv2.THRESH_OTSU)%20%23%20seuil%20220-255%0Aret%2C%20thresh_img%20%3D%20cv2.threshold(ima%2C%20127%2C%20255%2C%20cv2.THRESH_BINARY)%20%23%20Seuil%20127-255%0Afigure(figsize%3D(10%2C6))%0Aplt.subplot(331)%2Cimshow(ima)%2C%20plt.title(‘Image%20originale’)%0Aplt.xticks(%5B%5D)%2C%20plt.yticks(%5B%5D)%0Aplt.subplot(332)%2Cimshow(thresh_img1)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%2C%20plt.title(‘Radicule%20segment%C3%A9e_220_255’)%0Aplt.subplot(333)%2Cimshow(thresh_img)%2Cplt.title(‘Image%20binaris%C3%A9e’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)” message=”Binarisation d’Otsu ou le seuillage d’Otsu” highlight=”” provider=”manual”/]

Seuillage simple ou Segmentation simple

 

Si la valeur du pixel est supérieure à une valeur seuil, une valeur lui est attribuée (peut être blanche), sinon une autre valeur lui est attribuée (peut être noire). La fonction utilisée est cv2.threshold. Le premier argument est l’image source, qui doit être une image en niveaux de gris . Le deuxième argument est la valeur seuil qui est utilisée pour classer les valeurs de pixels. Le troisième argument est la valeur maximale qui représente la valeur à donner si la valeur du pixel est supérieure (parfois inférieure) à la valeur seuil.

OpenCV fournit différents styles de seuillage et il est décidé par le quatrième paramètre de la fonction. Les différents types sont :

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

Voici un code python pour montrer comment on peut appliquer les différents types de seuillage.

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20numpy%20as%20np%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-03-50-13_.tif’%2C0)%0Aret%2Cthresh1%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_BINARY)%0Aret%2Cthresh2%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_BINARY_INV)%0Aret%2Cthresh3%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TRUNC)%0Aret%2Cthresh4%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TOZERO)%0Aret%2Cthresh5%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TOZERO_INV)%0A%0Atitles%20%3D%20%5B’Original%20Image’%2C’BINARY’%2C’BINARY_INV’%2C’TRUNC’%2C’TOZERO’%2C’TOZERO_INV’%5D%0Aimages%20%3D%20%5Bimg%2C%20thresh1%2C%20thresh2%2C%20thresh3%2C%20thresh4%2C%20thresh5%5D%0A%0Afor%20i%20in%20range(6)%3A%0A%20%20%20%20plt.subplot(2%2C3%2Ci%2B1)%2Cplt.imshow(images%5Bi%5D%2C’gray’)%0A%20%20%20%20plt.title(titles%5Bi%5D)%0A%20%20%20%20plt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0A%0Aplt.show()” message=”Seuillage simple ou Segmentation simple avec python” highlight=”” provider=”manual”/]

Lecture et sauvegarde des images usb camera dans un repertoire

Lecture  et sauvegarde des images usb camera  dans un repertoire

Comment sauvegarder les images dans un répertoire spécifique?

Dans ce article, on va apprendre rapidement comment on peut enregistrer  les images acquises à partir des USB caméras dans un répertoire spécifique et avec un intervalle de temps d’acquisition précis en utilisant Opencv , time et OS.

 

On peut utiliser le système sur un raspberry pi pour faire des images ou superviser quelque chose soit avec un ordinateur.

Comme nous allons utiliser python, on aura besoin d’importer quelques librairies avant d’écrire notre code pour la capture et le sauvegarde des images.

Quelles libraires  importées?

On va importer trois librairies  qui sont:

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20os.path%20%20%23%20ou%20import%20os%0Aimport%20time%0A” message=”Librairies à importer” highlight=”” provider=”manual”/]

La librairie cv2 va nous aider à lire notre caméra et à sauvegarder  les images , os.path  va nous permettre d’avoir accès au système surtout au dossiers ou fichiers ou répertoire et enfin  time va nous permettre de gérer le temps et de nommer nos images avec le temps ou la date.

 

Après avoir importé nos librairies, on va maintenant initialiser la caméra si c’est une seule caméra ou les caméras.

On l’initialise avec la commande suivante:

[pastacode lang=”python” manual=”camera1%20%3D%20cv2.VideoCapture(0)” message=”Initialisation de la caméra” highlight=”” provider=”manual”/]

Ensuite on vérifie si la caméra est bien initialisée si oui on la lit avec la commande:

[pastacode lang=”python” manual=”while%20True%3A%0A%20%20%20%20ret1%2C%20frame1%20%3D%20camera1.read()” message=”Vérification et lecture de la caméra” highlight=”” provider=”manual”/]

On  déclare le répertoire dans lequel on veut enregistrer les images et l’intervalle de temps au bout duquel on veut capturer une image avec les commandes suivantes:

[pastacode lang=”python” manual=”%23%20declaration%20du%20r%C3%A9pertoire%20%0Apath1%20%3D%22.%2FBureau%2FImagetest%2FCamera1%22%0A%0A%23%20d%C3%A9claration%20du%20timelapse%0Atime.sleep(60)” message=”Déclaration du répertoire et du timelapse” highlight=”” provider=”manual”/]

La ligne path1 =“./Bureau/Imagetest/Camera1” représente le  chemin du répertoire et la ligne sleep(60) représente le timelapse , la durée pour acquérir une image.

Enfin si la caméra est bien lue,on procède à la visualisation et sauvegarde des images avec les commandes suivantes:

[pastacode lang=”python” manual=”%20if%20ret1%3A%0A%20%20%20%20%20%20%20%20cv2.imshow(%22camera1%22%2C%20frame1)%0A%20%20%20%20%20%20%20%20cv2.imwrite(os.path.join(path1%2C%20%22image1_%22%20%2B%20time.strftime(%22%25d-%25m-%25Y-%25H-%25M-%25S_%22)%20%20%2B%20%22.tif%22)%2Cframe1)” message=”Verification de lecture de la caméra et sauvegarde des images” highlight=”” provider=”manual”/]

Important: Quand on déclare un dossier sous linux, il faut mettre un point avant le chemin du répertoire mais sur windows et raspberry pi c’est raspbian on n’a pas besoin du point avant le chemin du répertoire.

Voici le code complet pour lancer la caméra et sauvegarder les images dans un répertoire spécifique en utilisant un python code python (opencv pour capture).

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20time%2Cos.path%0Afrom%20time%20import%20sleep%0Aimport%20os%0A%23%20initialiser%20les%20cam%C3%A9ras%0Acamera1%20%3D%20cv2.VideoCapture(0)%0A%0Acamera2%20%3D%20cv2.VideoCapture(2)%0A%0Awhile%20True%3A%0A%20%20%20%20ret1%2C%20frame1%20%3D%20camera1.read()%0A%20%20%20%20ret2%2C%20frame2%20%3D%20camera2.read()%0A%20%20%20%20%0A%20%20%20%20%23%20D%C3%A9claration%20du%20chemin%20des%20r%C3%A9pertoires%0A%20%20%20%20path1%20%3D%22.%2FBureau%2FImagetest%2FCamera1%22%0A%20%20%20%20path2%20%3D%22.%2FBureau%2FImagetest%2FCamera2%22%0A%0A%20%20%20%23%20D%C3%A9claration%20du%20timelapse%0A%20%20%20sleep(60)%0A%0A%20%20%20if%20ret1%3A%0A%20%20%20%20%20%20%20%23%20cv2.imshow(%22camera1%22%2C%20frame1)%0A%20%20%20%20%20%20%20%20cv2.imwrite(os.path.join(path1%2C%20%22image1_%22%20%2B%20time.strftime(%22%25d-%25m-%25Y-%25H-%25M-%25S_%22)%20%20%2B%20%22.tif%22)%2Cframe1)%0A%20%20%20%20%20%20%20%0A%20%20%20%20if%20ret2%3A%0A%20%20%20%20%20%20%20%23%20cv2.imshow(%22camera2%22%2C%20frame2)%0A%20%20%20%20%20%20%20%20cv2.imwrite(os.path.join(path2%2C%20%22image2_%22%20%2B%20time.strftime(%22%25d-%25m-%25Y-%25H-%25M-%25S_%22)%20%20%2B%20%22.tif%22)%2Cframe2)%0A%20%20%20%20%20%20%20%20camera2.set(cv2.CAP_PROP_FRAME_WIDTH%2C%201920)%0A%20%20%20%20%20%20%20%20camera2.set(cv2.CAP_PROP_FRAME_HEIGHT%2C%201080)%0A%20%20%20%0A%20%20%20%20%20if%20cv2.waitKey(1)%20%26%200xff%20%3D%3Dord(‘a’)%3A%0A%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20break%0A%0Acamera1.release()%0Acamera2.release()%0Acv2.destroyAllWindows()%0A%0A” message=”Code complet” highlight=”” provider=”manual”/]

Ce code permet de lancer deux caméras directement soit sur un raspberry pi ou un pc (linux , windows ou macox) en banchant les deux caméras à deux ports USB, enregistrer les images acquises de chaque caméra dans un répertoire différent suivant le même intervalle de temps ici 60 secondes soit 1 minuit pour chaque image.

J’espère que ce article vous a aidé.

A lire aussi (Installer un raspberry pi)

 

Contrôler son Raspberry Pi à distance avec VNC

Contrôler  son Raspberry Pi  à distance avec VNC

Le contrôle à distance du  Raspberry Pi depuis un autre ordinateur est particulièrement intéressant dans certaines situations ou utilisations particulières, par exemple si on ne souhaite pas l’utiliser comme un “simple” nano-ordinateur, mais plutôt comme un objet connecté avec des fonctions spécifiques comme dans notre cas.Deux moyens sont à notre disposition pour cette prise de contrôle à distance :

  1. via SSH, uniquement en ligne de commande dans un terminal (le plus «rapide» et efficace
    dans certains cas, et quand on est un utilisateur assez avancé ou quand on maîtrise les lignes de commande)
  2. via VNC, avec une interface graphique complète habituelle et prise en charge du
    clavier et de la souris et autres.

Dans ce article, je vais vous montrer comment contrôler votre raspberry pi depuis un autre ordinateur via le VNC

 

Pour contrôler le raspberry pi via le VNC, on a besoin  de deux choses essentiels qui sont le VNC server et le VNC Viewer.

Le VNC server ou le serveur VNC est  le VNC qu’on doit activer  sur le raspberry pi qu’on veut contrôler et le VNC viewer est le VNC qu’on va installer sur l’ordinateur, la tablette ou le portable qu’on va utiliser pour contrôler le raspberry.

Comment installer VNC sur Raspberry Pi ?

Pour activer le VNC sur son raspberry pi on a deux méthodes:

  • Depuis l’option configuration du raspberry pi
  • Depuis le terminal

 

Depuis l’option configuration du raspberry pi: Quand on clique sur le logo du raspberry on choisit Préférence suivi  de Configuration de la Raspberry pi ensuite interfaces enfin activé devant le VNC et on valide pour redémarrer le raspberry pi.

Depuis le terminal:  On ouvre le terminal  et on tape la commande sudo raspi-config, une fois ouvert on choisit l’option Interfaces Options ensuite VNC enfin sur OUI ou YES pour valider et redémarrer le raspberry pi.

ensuite

enfin

 

Une fois que le vnc server activé il faut le configurer pour pour accéder à distance.

La première est de cliquer sur le logo de VNC ensuite vous avez connectivité si votre raspberry est connecté à l’internet vous aurez son adresse IP par exemple le mien est 192.168.1.84 ensuite vous allez dans le menu du VNC server qui vient d’être activer sur votre raspberry pi et cliquez sur Options. Une fois que la page de l’options est ouverte, vous avez la possiblité de choisir ce que vous voulez contrôler à distance dans connexions enfin dans la partie authentification vous choisissez le Mot de passe VNC et vous configurez le mot de passe que vous voulez utilisez pour accéder au raspberry via un autre appareil, une fois fini vous cliquez sur Appliquer et OK.

ensuite

On vient de finir  la partie VNC server sur notre raspberry pi. Il reste à installer le VNC viewer sur notre appareil soit ordinateur, portable ou tablette pour contrôler le raspberry pi sur lequel on vient d’activer le VNC server.

 

Il faut donc télécharger le logiciel VNC viewer (ici).

Ensuite on ouvre notre VNC viewer en tapant l’adresse IP de notre raspberry pi suivi du mot de passe qu’avait défini dans la configuration du vnc server et on aura accès à notre raspberry pi suivant le type de connexions qu’avait choisi.

Voir aussi (Comment utiliser caméra USB sur raspberry pi)

NB: On ne peut contrôler le raspberry pi depuis un autre appareil seulement si on est sur le meme réseau ou si on accède au réseau du raspberry pi par un VPN du réseau auquel le raspberry pi est connecté.

Configuration de la Picaméra

Configuration de la Picaméra

Le système Raspbian n’est pas configuré pour utiliser la caméra d’origine, nous devons activer l’option dans les configurations : dans le menu démarrer droite > Préférences droite >Configuration du Raspberry Pi. Dans la fenêtre de configuration, on sélectionne l’onglet Interfaces et on coche la case Activé en face de Caméra ensuite on redémarre notre raspberry pi pour que l’activation soit prise en charge.

Soit on l’active depuis le terminal en suivant les étapes suivantes.On tape la commande
suivante dans le terminal en utilisant la commande : sudo raspi-config

Une fois dans le menu, on se sert des flèches directionnelles et on sélectionne Interfacing Options puis Caméra.

Enfin, on sélectionne oui ,quand on demande la confirmation d’activation ainsi que pour redémarrer le Raspberry. Après le redémarrage de notre raspberry, on peut vérifier si la caméra fonctionne en faisant un test avec la commande
suivant qu’on tappe dans le terminal : raspistill -o phototest.jpg. 

ensuite oui

Pour aller plus loin visitez (ici)

Installer Raspberry pi

Installer Raspberry pi

Installation Raspbian

Pour pouvoir utiliser notre raspberry, nous devons installer le système d’exploitation raspbian dans un premier temps et quelques logiciels sur le raspberryPi. Pour cela, nous avons
donc besoin d’une carte SD  sur laquelle nous allons installer notre système d’exploitation, nous avons aussi besoin d’un adaptateur de carte SD sous forme :


Ensuite vient l’étape de copier l’image du raspbian sur la carte SD. Nous avons choisi d’utiliser le logiciel Raspberry Pi Imager V1.5 (ici)

qui est l’outil officiel destiné à simplifier l’installation des systèmes d’exploitation sur la carte SD du Raspberry Pi. Le logiciel Raspberry Pi Imager se charge de gérer le téléchargement de l’image à notre place dans l’option système d’exploitation et on choisit le système qu’on veut.

Pour permettre le téléchargement automatique, Raspberry Pi Imager va aller, au lancement, chercher un fichier .json sur le site de la fondation (https://www.raspberrypi.org/software/). Le fichier contient les liens vers les dernières versions des différentes images.

Après la copie de l’image sur la carte SD, on place la carte dans le port SD carte  du Raspberry Pi et on suit juste les étapes jusqu’à la fin de l’installation.

Afin de s’assurer que tout marche bien, on va d’abord mettre à jour les pilotes en utilisant deux commandes dans le terminal.

Etapes pour mise à jour du Raspberry Pi

Mettre à jour son Raspberry Pi est important puisque cela vous apporte des correctifs de sécurité, des nouvelles versions de vos logiciels du Raspbian. Il faut donc connecter votre raspberry à l’internet via le wifi ou un câble RJ45 connecté à l’internet via un switch ou un routeur au port RJ45 de la raspberry. Ensuite dans notre terminal on fait la mise à jour des paquets en utilisant la commande suivante :
sudo apt-get update
Ensuite on fait la  mise à jour de la distribution avec la commande : sudo apt-get upgrade
Enfin  on fait la mise à jour du raspbian avec la commande :
sudo rpi-update
Si nous voulons que tout soit fait sans que l’on nous demande confirmation ,on utilise la commande suivante :
sudo apt-get update & sudo apt-get -y upgrade & sudo apt-get -y dist-upgrade & sudo rpi-update

 

Comme nous sommes maintenant assurés que notre système d’exploitation est à jour, nous
allons maintenant procéder à la configuration de notre caméra sur notre raspberry.
Nous allons d’abord connecter notre Pi caméra sur la raspberry. Il faut pour cela éteindre
et débrancher la carte Raspberry Pi avant de brancher la caméra. On connecte la caméra au
port CSI, situé entre les connecteurs HDMI et jack. On peut donc procéder de la manière
suivante :

  1. On Tire doucement le verrou du connecteur (morceau blanc)vers le haut pour le
    débloquer
  2. On insère la nappe de la caméra sans forcer, la partie bleue tournée vers la prise jack
  3. Enfin on referme le verrou, et on vérifie si la nappe est maintenant maintenue.
    Il faut maintenant configurer la caméra.

Reconstitution d’une image nette à partir de deux images , focus shape

Reconstitution d’une image  nette à partir de deux images , focus shape

Beaucoup de personnes se demandent comment reconstituer  une image nette à partirr de deux images dont une partie est nette dans chacune des deux images. Je vais à travers ce  tutoriel  vous montrer méthodes qu’on peut utiliser pour faire la reconstitution d’image avec matlab ou python.

Voici les trois méthodes utilisées pour faire les opérations de calcul de focus :

  1. Écart type local de l’image ou Local standard deviation of image
  2. Entropie locale de l’image en niveaux de gris ou Local entropy of grayscale image
  3. Portée locale de l’image ou Local range of image

Avant de commencer il faut lire les images qu’on veut utiliser pour faire la reconstitution en matlab avec la fonction :

img1= im2double(imread(‘p30a.jpg’));
img2=im2double(imread(‘p30b.jpg’));

On va maintenant appliquer la méthode qu’on veut utiliser. Si on prend chacune d’elle on peut les appliquer des manières suivantes:

Écart type local de l’image ou Local standard deviation of image

J1 = stdfilt(img1)  et  J2 = stdfilt(img2) de sorte J1 et J2  effectue chacune  un filtrage par écart type de l’image img1 et img2 et renvoie l’image filtrée J1 et J1. La valeur de chaque pixel de sortie est l’écart type du voisinage 3 par 3 autour du pixel d’entrée correspondant. Pour lespixels situés sur les bords de I, stdfilt utilise un rembourrage symétrique. Dans le rembourrage symétrique,les valeurs des pixels de rembourrage sont une réflexion miroir des pixels de bordure dans I (img1 ou img2).Image filtrée, renvoyée sous la forme d’un tableau numérique de même taille que l’image d’entrée I. La classe de J est double.

J1=stdfilt(img1);%Local standard deviation of image
J2=stdfilt(img2);

Ensuite on a:

%focus=max(max(J1(i,j,k),J2(i,j,k)));%Local standard deviation of image  de sorte que notre image qui sera reconstituée sera celle qui va récupérer le maximun des pixels de chacune des deux images pour former une nouvelle image.

Voici le résultat que nous avons en applique la méthode de l’Écart type local de l’image

 

Entropie locale de l’image en niveaux de gris ou Local entropy of grayscale image

L’entropie est une mesure statistique du caractère aléatoire qui peut être utilisée pour caractériser la texture
de l’image d’entrée. L’entropie est définie comme  : –Σ(P * log2(P)), où p contient le nombre d’histogrammes normalisés renvoyés par l’imhist.
Par défaut, entropyfilt utilise deux bacs pour les tableaux logiques. entropyfilt convertit toute autre classe
en uint8 pour le calcul du nombre d’histogrammes et utilise 256 bacs afin que les valeurs des pixels soient
discrètes et correspondent directement à une valeur de bac.
J = entropyfilt(I) renvoie le tableau J, où chaque pixel de sortie contient la valeur d’entropie du
voisinage 9 par 9 autour du pixel correspondant dans l’image d’entrée I.
Pour les pixels situés aux limites de I, entropyfilt utilise un remplissage symétrique. Dans le cas du
remplissage symétrique, les valeurs des pixels de remplissage sont une réflexion miroir des pixels de bordure
dans I.

Dans notre cas on :

b1= entropyfilt(img1); % Local entropy of grayscale image,
b2=entropyfilt(img2);

focus=max(max(b1(i,j,k),b2(i,j,k))); %Local entropy of grayscale image

Et enfin on a la méthode

Portée locale de l’image ou Local range of image

J = rangefilt(I) renvoie le tableau J, où chaque pixel de sortie contient la valeur de plage (valeur maximale
– valeur minimale) du voisinage 3 par 3 autour du pixel correspondant dans l’image d’entrée I.
La fonction rangefilt renvoie un tableau où chaque pixel de sortie contient la valeur de plage (valeur
maximale – valeur minimale) du voisinage 3 par 3 autour du pixel correspondant dans l’image d’entrée. Image
filtrée, retournée sous forme de tableau numérique, de même taille et de même classe que l’image d’entrée I,
à l’exception des types de données entières signées. La classe de sortie pour les types de données signées est
le type de données entières non signées correspondant. Par exemple, si la classe de I est int8 ou double, alors
la classe de J est uint8 ou double.Rangefilt utilise les fonctions morphologiques imdilate et imerode pour
déterminer les valeurs maximales et minimales dans le quartier spécifié. Par conséquent, le rangefilt utilise
le comportement de rembourrage de ces fonctions morphologiques.

c1=rangefilt(img1);% Local range of image
c2=rangefilt(img2);

Et on a le résultat suivant:

Enfin je vous montre le résultat global des trois méthodes:

Voir aussi (Lire et afficher une image avec opencv python)

Prenez le contrôle à distance d’un autre ordinateur depuis votre navigateur internet…

Prenez le contrôle à distance d’un autre ordinateur depuis votre navigateur internet…

 

Aujourd’hui travailler sur son de bureau de son domicile devient nécessaire comment peut on alors contrôler son pc ou prendre en main son pc à distance depuis un navigateur ou un logiciel via un réseau ou via l’internet?

Voici quelques solutions pratiques :

Getscreen.me 2.2.3 est  est un logiciel permettant de prendre le contrôle à distance d’un autre ordinateur depuis votre navigateur internet. C‘est très pratique pour télé-travailler ou dépanner un ami sans vous déplacer. Pour cela, il suffit d’exécuter Getscreen.me sur l’ordinateur dont vous souhaitez prendre le contrôle à distance. Getscreen.me vous délivre alors un lien internet (de type https://go.getscreen.me/8xn-71m où 8xn-71m est la variable qui permet d’identifier l’ordinateur). Saisissez cette adresse internet sur votre second ordinateur (celui qui prendra le contrôle sur le premier ordinateur) dans votre navigateur web. La connexion s’établie alors. Vous prenez le contrôle du PC, comme si vous étiez devant. Getscreen.me supporte également le transfert de fichiers d’un ordinateur à l’autre. La version   gratuite de Getscreen.me permet d’établir des connexions à distance qui ne peuvent dépasser 15 minutes et dont les fichiers transférés ne doivent pas excéder 50 Mo. Au-delà, vous devrez vous tourner vers un abonnement mensuel. Pour le télécharger aller (ici)

Vous avez aussi la possibilité d’utiliser d’autres logiciels de contrôle  distance comme:

  • TeamViewer : la référence. . Télécharger (ici)
  • AnyDesk : l’outil portable et réactif .. Télécharger (ici)
  • VNC : le préféré des professionnels. Télécharger (ici)
  • Chrome Remote Desktop : la solution signée Google .. Télécharger (ici)
  • DWService : le contrôle à partir du navigateur web. ..Télécharger (ici)
  • Iperius Remote…Logiciel de bureau à distance gratuit, un outil facile à utiliser pour contrôler à distance un ordinateur/serveur, pour réunions en ligne et téléassistance. …Télécharger (https://www.iperiusremote.fr/)

1 2