Programmation Python Detecteur de couleur

a marqué ce sujet comme résolu.

Bonjour,

Mon professeur m’a donné un programme à réaliser : détecter a l’aide d’une camera la couleur d’un objet ou quoi que ce soit d’autre, et ecrire "rouge" si l’objet est rouge par exemple.

Le problème étant que je n’ai quasiment aucune connaissance en python et je ne sais donc pas du tout par quoi commencé

A noter que je dispose d’un programme permettant d’afficher le rendu de la camera.

Pouvez-vous ainsi m’aider.

Merci d’avance cordialement.

Salut !

Je dirais qu’il nous faudrait un peu plus d’infos pour éclairer ta lanterne ;) ! Tu dis que tu n’as presque aucune connaissance en Python : tu n’as jamais programmé avec ? Je trouve ça bizarre qu’on te demande de faire de l’analyse d’image si tu n’as pas encore les bases du langage. Si je devais résoudre ce problème, j’utiliserais probablement OpenCV pour récupérer l’image depuis la webcam et calculer la moyenne des couleurs de l’ensemble des pixels de l’image, mais je pense qu’il serait un peu ambitieux que tu te lances là dedans sans un minimum d’expérience du langage.

+2 -0

en fait on a vu en cours un bouquin avec plein de petits exercices a l’interieur, le probeleme etant que aucun de ces exos m’a l’air d’etre interessant a utiliser pour ce type de projet
d’apres un programme que l’on a vu en cours, ils convertissaient l’image en HSV ai-je besoin de ca ?

de plus mon professeur m’a donné des logiciels a installer pour faire des tests a la maison et notamment openCV

je vous donne le programme qui m’a était donné :

import cv2

import time

import numpy as np

cv2.namedWindow(’tracking’)

take input from camera

cap = cv2.VideoCapture(2)

while(1):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    success,frame = cap.read()

    # print(success)


if success==True :

    #print(frame)

    cv2.imshow('tracking',frame)

    time.sleep(0.1)

k = cv2.waitKey(5) & 0xFF

# Esc key to stop

if k == 27:

    break

cap.release()

cv2.destroyAllWindows()

+0 -0

cet exercice est "une tache de fin" qui sera noté, sachant que les petits exos m’ony été donné il y a une semaine, et que j’ai fait sans vraiment trop de réussites, et cet exercice est a rendre pour la semaine prochaine, aidez moi s’il vous plait

+0 -0

Salut,

Ma réponse sera identique à celle que je t’avais faite ici, puisque le sujet est le même.

L’idéal serait de commencer par apprendre la programmation, avec ce cours par exemple : https://inforef.be/swi/download/apprendre_python3_5.pdf

Et quand tu seras au point là-dessus, il te faudra probablement t’orienter vers opencv.


Bon allez, pour tout de même réagir sur tes messages suivants.

en fait on a vu en cours un bouquin avec plein de petits exercices a l’interieur, le probeleme etant que aucun de ces exos m’a l’air d’etre interessant a utiliser pour ce type de projet

jhache1_

Ces exercices n’ont pas à être intéressants pour ce type de projet. Ils sont là pour t’apprendre le Python et l’algorithmique. Parfois ils peuvent être un peu rébarbatifs, mais preuve en est que tu en as besoin.

cet exercice est "une tache de fin" qui sera noté, sachant que les petits exos m’ony été donné il y a une semaine, et que j’ai fait sans vraiment trop de réussites, et cet exercice est a rendre pour la semaine prochaine, aidez moi s’il vous plait

jhache1_

Mais qu’attends-tu précisément comme aide ? Car nous ne ferons pas l’exercice à ta place.

Si tu n’as pas réussi les précédents exercices, retente-les, après avoir parfait tes connaissances.

Question : cet exercice, il est dans quel cadre, tu es dans quelle filière ?

Si tu cherches à apprendre la programmation en Python, c’est surprenant qu’on te soumette cet exercice.

Si tu es dans une filière très précise, de traitement d’image ou quelque chose comme ça, et si on t’a présenté des librairies très pointues, et qu’on te demande d’utiliser ces librairies, alors ça me va mieux.

je suis en informatique industrielle et electronique, j’ai appris que le language C et travaillé sur Arduino DUO. La je dois realiser un programme en python (comme indiqué dans le titre) et l’executer sur un raspberry PI il s’agit d’un projet dans lequel j’ai fait quelques exercices modifié des programmes qui comporté des erreurs mais rien de tres poussé on va dire donc j’ai quelque « base » mais rien d’extraordinaire voyez vous, de plus mon professeur m’a dit d’installer open cv, pyzo, numpy, matplotlib mais j’ai n’ai aucune autre aide, c’est donc pour ca que je demandes de l’aide sur des forums merci

Ok, donc on avance.

N’étant pas informaticien, je connais vaguement numpy, mais je ne connais rien à opencv, pyzo, matpotlib etc etc

Je regarde donc la descriptions de ces outils, via wikipedia (on reste très grand-public), et pour opencv, je vois que OpenCV propose : ’calcul de l’histogramme des niveaux de gris ou d’histogrammes couleurs ’

Autrement dit, il y aurait une fonction dans openCV qui permettrait de dire : dans telle image, on a telle proportion de rouge, telle proportion de bleu etc … C’est probablement ça que ton prof veut que tu utilises. Eventuellement, va voir ton prof pour vérifier avec lui que c’est ça qu’il attend.

Donc les étapes, ce serait :

  • tu as ta caméra qui envoie ’en continu’ des images. Tu en prends une au hasard, tu pourras revenir plus tard sur ce point, et traiter une image toutes les secondes par exemple. Ce n’est pas important.

  • A partir d’une image, et à l’aide d’OpenCV, récupérer cet ’histogramme des couleurs’ dont on parle dans Wikipédia. Il va falloir lire la documentation sur OpenCV pour trouver la bonne syntaxe. Ceci est totalement indépendant de l’étape précédente, l’image peut venir de la caméra, ou elle peut être n’importe quelle image que tu as à disposition.

  • A partir de cet histogramme des couleurs, on va se fixer une règle : si la couleur rouge est la première en terme de fréquence, alors afficher ’ROUGE’ sinon afficher ’AUTRE’.

Voilà en gros les 3 étapes à suivre.

La 1ère étape, tu l’as déjà plus ou moins faite. La 3ème étape devrait être assez simple. Reste la 2ème. A toi de lire la documentation d’OpenCV pour trouver la bonne fonction.

Le fait que tu sois en informatique industrielle, et pas en informatique pure est important. En informatique pure, on t’apprendrait plus ou moins à écrire cette librairie OpenCV. En informatique industrielle, on t’apprend à l’utiliser.

Bonjour comme convenu je poste mon travail :

import cv2

import numpy as np

from matplotlib import pyplot as plt

cv2.namedWindow(’tracking’)

import time

cap = cv2.VideoCapture(2)

color = (’b’,’g’,’r’)

for i,col in enumerate(color):

while (1):

success,frame = cap.read()

if success==True :

cv2.imshow(’tracking’,frame)

time.sleep(0.1)

histr = cv2.calcHist([cap],[i],None,[256],[0,256])

plt.plot(histr,color = col)

plt.xlim([0,256]

plt.show()

d’apres mes recherches "histr = cv2.calcHist([cap],[i],None,[256],[0,256])" permettrait d’afficher l’histogramme de couleur BGR de ce que voit la camera, pour qu’il prenne en compte la caméra j’ai essayé d’y intégrer mon programme qui permettait de lire ce que voyait la camera

cependant il persiste des erreurs que je n’arrive pas a corriger pouvez vous m’aider merci

+0 -0

En programmation, il faut toujours décomposer en problèmes simples. Toujours.

Tu peux avoir par exemple un premier chantier : Tu prends le flux de la caméra, et tu génères un fichier image (un fichier sur ton disque dur). Tu peux ainsi facilement vérifier si ce petit programme marche. Et si tu galères sur cette étape, tu peux demander de l’aide sur cette étape. Pas d’analyse des couleurs à ce niveau, juste capturer et stocker une image.

Ensuite, étape 2, tu captures une image toutes les secondes, et non plus une seule image.

Ensuite, 3ème chantier, TOTALEMENT INDEPENDANT des 2 premiers chantiers, tu prends un fichier image de ton disque dur, un des fichiers de la première étape, ou un fichier autre, peu importe. Et à partir de ce fichier image, tu essaies de déterminer l’histogramme des couleurs. Sur ce nouveau chantier simple, tu peux demander de l’aide si nécessaire.

Mais si tu fais un programme qui fait tout, et que tu dis que ça ne marche pas, sans savoir si c’est la capture d’image qui plante, ou le traitement de l’image qui plante, on ne peut pas t’aider.

pour une image rouge : https://imgur.com/31LYimO

pour une image bleu : https://imgur.com/jS4ozxu

pour une image jaune : https://imgur.com/6aYAuUC

j’ai reussi a recuperer l’histogramme de couleur d’une image, cependant je n’arrive pas a savoir comment faire pour exploiter correctement l’histogramme pour que l’ordinateur ecrive "rouge" si l’image est rouge

+0 -0

Difficile de t’aider, on manque de visibilité.

Est-ce que les 3 histogrammes sont corrects ? peut-être que oui, peut-être que non.

Dans ton cas, tu n’as pas besoin de la fonction plot().

Tu as cette instruction histr = cv2.CalcHist(…) qui initialise un tableau histr. Considérons que la syntaxe que tu utilises est bonne, et que histr est exploitable. Admettons. MAis il faudrait s’en assurer d’une façon ou d’une autre.

Ensuite, à partir de ce tableau histr, les tutoriels suggèrent d’afficher le tableau histr sous forme d’image. Pourquoi pas, ça permet d’avoir un résultat rapide. Mais l’image en question (les 3 images que tu as postées), c’est à peu près inexploitable par programme. Par contre, le tableau histr, c’est un tableau avec 3 colonnes et 256 lignes si j’ai tout suivi, et un tableau de nombres, c’est un truc qui est ’’facile’’ à traiter par un programme, beaucoup plus facile à traiter que les 3 dessins que tu as postés.

Normalement, tu n’as aucune raison d’utiliser matpotlib dans ce programme.

bon par l’intermediaire d’autres instructions j’ai reussi a recuperer les valeurs R G B a partir d’un pixel de l’image :

from PIL.Image import *

i = open("bleu.jpg")

Image.show(i)

x = 47

y = 90

(r,g,b) = i.getpixel((x,y))

print ("R=",r, "G=",g, "B=",b)

le resultat est le suivant :

R= 1 G= 33 B= 154

Si vous connaissez une fonction permettant de traiter ce resultat pour dire que l’image est bleu, de l’aide serait la bien venu, pour l’instant je continu de chercher

merci cordialement

finalement j’ai defini des intervalles pour r g b propre a leur couleur respective

from PIL.Image import *

i = open("bleu.jpg")

x = 47

y = 90

(r,g,b) = i.getpixel((x,y))

print ("R=",r, "G=",g, "B=",b)

if ((r<50 and b>32) or (b>32 and g<50)):

1
print("L'objet est de couleur bleu")

if (r<32 and g<32 and b<32):

1
print("L'objet est de couleur noir")

if (r>200 and g>200 and b<50):

1
print("L'objet est de couleur jaune")

if (r>225 and g>225 and b>225):

1
print("L'objet est de couleur blanche")

if ((r>32 and b<50) or (r>32 and g>50)):

1
print("L'objet est de couleur rouge")

if ((g>32 and r<50) or (g>32 and b>50)):

1
print("L'objet est de couleur verte")

de ce que j’ai pu voir il n’existe pas d’instruction permettent de realiser ce que je cherché, reste plus que faire en sorte que l’image vienne de la camera et ce sera operationnel

Ici, tu prends un pixel particulier, et tu donnes la couleur de ce pixel. Tant que tu travailles avec des images unies, ok, mais les images ne seront pas systématiquement unies. Pourquoi ce pixel(47,90) plutôt qu’un autre ?

Autre point, si le pixel est (r=220, g=220, B=30), ton programme va afficher 2 lignes : jaune, et rouge.

je sais il faut que j’essaies de trouver les intervalles r g b les plus appropriés, mais je prefere avancer dans le probleme car il me reste peux de temps et cette partie la (trouver les bons intervalles r g b) se fait rapidement

j’ai aussi choisis ce pixel provisoirement, quand je verrai mon prof pour avoir la camera je m’arrangerai pour trouver le pixel se trouvant au milieu de l’image (chose facile a faire aussi)

+0 -0

En gros, plutôt que de te baser sur UN pixel, tu dois plutôt récupérer la valeur de l’ensemble des pixels de ton image et faire tes tests sur la Moyenne. Tu n’as pas besoin de PIL pour ça, il me semble qu’il suffit pour cela que tu récupères l’image via OpenCV (ce qui est pratique, vu que tu vas de toute façon t’en servir pour récupérer l’image depuis ta webcam) et que tu calcules la moyenne avec la méthode average() de numpy (les images OpenCV sont des tableaux numpy, ce qui permet d’effectuer tout un tas d’opérations dessus directement).

Ah bah tiens, en cherchant un peu, je suis tombé sur ce thread sur StackOverflow qui répond en partie à tes questions. En gros, pour trouver la couleur moyenne, c’est aussi simple que ça :

1
2
3
4
5
import cv2
import numpy
myimg = cv2.imread('image.jpg') # Là tu remplaces par l'utilisation de la webcam
avg_color_per_row = numpy.average(myimg, axis=0)
avg_color = numpy.average(avg_color_per_row, axis=0)

Si tu vas voir le thread, il y a une réponse plus détaillée sur comment détecter la couleur dominante d’une image d’une manière plus fine que seulement en se basant sur la moyenne, c’est intéressant, maintenant c’est plus complexe aussi et je ne sais pas si ton prof veut que vous alliez aussi loin.

+0 -0

j’ai testé le programme cependant il me met une tonne d’erreur que je n’arrive pas du tout a comprendre :

Traceback (most recent call last):

File "C:\Users\JULIEN HACHE\Desktop\proj tut\test 3.py", line 4, in <module>

1
avg_color_per_row = numpy.average(myimg, axis=0)

File "c:\users\julien hache\miniconda3\lib\site-packages\numpy\lib\function_base.py", line 1128, in average

1
avg = a.mean(axis)

File "c:\users\julien hache\miniconda3\lib\site-packages\numpy\core_methods.py", line 57, in _mean

1
rcount = _count_reduce_items(arr, axis)

File "c:\users\julien hache\miniconda3\lib\site-packages\numpy\core_methods.py", line 50, in _count_reduce_items

1
items *= arr.shape[ax]

IndexError: tuple index out of range

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte