Pièce jointe 179486bonjour a tous ; j'ai un petit problème je veux calculez la longueur et la largeur d'un matricule a l'aide d'un petit programme merci d'avance .
Version imprimable
Pièce jointe 179486bonjour a tous ; j'ai un petit problème je veux calculez la longueur et la largeur d'un matricule a l'aide d'un petit programme merci d'avance .
Bonjour,
Première chose, si tu veux des dimensions absolues et non relatives, il va te falloir un repère de dimension connue dans ta photo.
je veux juste calculez la dimension on pixel , après je veux utilisez la focale et .............
Peux tu nous montrer ce que tu as déjà commencer à coder?
Qu'est-ce que tu veux faire exactement? Avant de calculer ses dimensions il faut repérer la plaque sur l'image. Si ça doit être fait de façon automatique et non manuel, ce n'est pas tout à fait trivial... On ne va pas faire tout le projet à ta place. Décris nous la démarche que tu comptes mettre en place, ce que tu as déjà commencer à faire, ce sur quoi tu bloques.
on premier temps pour la détection de la plaque (la plaque est jaune )
alors j'ai fais un balayage de l'image jusque que le pixel jaune (|R-G| < 33) et avec deux boucle for et le tour et jouer , sa marche mais avec plusieurs condition , -pas d'autre couleur jaune , -avec un fond blanc ,-ou un fond noir ,
j'ai essaye de travailler sur l'image en gray , la même chose toujours des complication quand il y'a plusieurs élément de différente couleur :calim2:
je veux maintenant essayer l'approche par la détection de contour , j'ai commence avec label , mais je c pas comment travailler avec cette dernier , je suis nouveaux sur matlab
Tu peux dans un premier temps transformer ton image en niveau de gris avec la fonction rgb2gray puis tenter d'utiliser la fonction bwboundary pour répertorier tout les contours de ton image. La question qui se pose ici, et plus généralement dans le cadre d'une détection automatique, c'est "qu'est-ce qui différencie mon objet du reste de l'image". Plusieurs pistes peuvent être creusées, la forme, la couleur, les dimensions, l'emplacement sur l'image... Si c'est pour une unique image c'est assez facile à fixer les paramètres pour pouvoir identifier quel est le contour qui t'intéresse. Si c'est pour une banque de données d'images, c'est bien plus complexe, et cela dépend des caractéristiques de ton image.
cercle = round(dim(2)/2)-90; c pour détecter un cercle ,et pour détecter un rectangle comment faire ?
Non, c'est une ligne de code qui sortie de son contexte ne sert pas à grand chose. Et même en imaginant un peu le contexte, je ne vois pas trop comment tu vas faire pour "détecter" un cercle avec une telle ligne de commande. Je ne vois pas comment t'aider si tu:
1) Ne m'explique pas exactement ce que tu désires faire
2) Ne lis pas/ne réagis pas aux messages que j'envoie.
ma plaque plaque a 2 caractère :
1- elle est jaune
2- longueur=X*largeur .
j'ai vue un exemple de détection d'un cercle
je voulais suivre les même étape mais pour un rectangle ;Code:
1
2
3
4 dim = size(BW) col = round(dim(2)/2)-90; row = min(find(BW(:,col))) boundary = bwtraceboundary(BW,[row, col],'N');
détection d'un rectangle qui a une dimension de largeur = longueur * X,
X prédéfinie Pièce jointe 179515
Code:
1
2
3
4
5
6
7
8 img=getsnapshot(webcam); BW = im2bw(img); BW=~BW; imtool(BW); dim = size(BW) % rec =??????????????? row = min(find(BW(:,rec))) boundary = bwtraceboundary(BW,[row, rec],'N');
Ces deux lignes
servent à "choisir" la pièce. round(dim(2)/2)-90 est égale à 60, ce qui représente approximativement la colonne centrale de la pièce choisie. Si tu désires détecte ta plaque de façon automatique, ce n'est pas la bonne méthode.Code:
1
2 col = round(dim(2)/2)-90; row = min(find(BW(:,col)));
OK , merci de votre réponse , la fonction bwboundary m'aide a faire quoi ?
ou bien peux tu me orienter ou je peux trouver une documentation en français , sur cette fonction ;
et si tu peux me orienter un peux
La fonction bwboundary est une fonction qui à partir d'une image en niveau de gris (noir et blanc), va te donner 4 paramètres de sorties dont les deux premiers (les deux intéressants pour toi) sont:
-les coordonnées du contour de chaque objet présent sur ton image en niveau de gris
-le masque de l'image, c'est à dire une image de la taille de ton image initiale telle que masque == 1 est l'image avec uniquement le premier objet, masque == 2 le deuxième objet et ainsi de suite
Teste cette fonction sur ton image transformée en niveau de gris et regarde ce que tu obtiens, c'est en expérimentant que tu apprendras.
je vais voire , merci de ta réponse .
quand je termine je pose le résulta
je ne vois pas a quoi peux m'aide sa ou bien je ne c pas utiliser la fonctionCode:
1
2
3
4
5 %img=getsnapshot(webcam); BW = im2bw(img); imtool(BW); [B,L] = bwboundaries(BW); imshow(label2rgb(L));
j'ai essaye tous les moyens je n'arrive pas ; j'ai lue touts la documentation sur les deux paramétré B,L sur matlab ,mais comment savoir les celles du matricule ;
:(
Comme je l'ai dit il n'y a rien de trivial...
Autrement dit, tu dois réfléchir à ce qui fait que ton cerveau, en regardant l'image, comprend où est la plaque. Il faut que tu décomposes les étapes de ton processus de décision. Ce n'est pas évident de rapprocher ce processus de décision à des algorithmes, mais tu peux commencer par les bases.Citation:
Envoyé par Gooby
Par exemple: tu as déterminé les contours de chaque objet de ton image. Maintenant que tu possèdes les masque de ces objets, tu peux regarder ceux qui sont jaunes de façon plus ou moins homogène dans ton image. Pour reprendre ton critère de tout à l'heure ça donnerait un truc de ce genre:
Prenons le masque de l'objet numéro 10:
Maintenant en reprenant ton critère pour le jaune qui était (|R-G| < 33)Code:
1
2
3
4 myMask = zeros(size(L)); myMask(L==10) = 1; img_objet10 = myMask.*img; % Ce qui représente ton image de base avec uniquement l'objet numéro 10 identifié par ta fonction bwboundaries.
On vérifié que l'objet numéro 10 est jaune:
Voilà, je t'ai déjà mis sur une piste potentielle. A ma connaissance ton problème est loin d'être trivial. Encore une fois je ne vais pas faire le projet à ta place, si tu viens uniquement pour dire "j'ai tout essayé je trouve pas, aidez moi" personne ici ne t'apportera de l'aide. Alors réfléchis bien aux messages que j'ai écrit et reviens nous proposer un début de code cohérent.Code:
1
2
3
4
5
6
7
8 Rlevel = img_objet10(:,:,1); mean_Rlevel = mean(mean(Rlevel(Rlevel >0)); %idem pour le vert Glevel = img_objet10(:,:,2); mean_Glevel = mean(mean(Glevel(Glevel>0)); if abs(mean_Rlevel-mean_Glevel) <33 %mon objet est jaune, donc il y a des chances pour que ça soit la plaque... end
merci beaucoup . je vais l’essaye . et vous rendre la reponse
BON , comment faire pour explique , je veux on premier temps affichez tous les objet retrouver sur mon image séparément .
pour sa j'ai essaye et sa ne marche pas , BIEN sur :calim2: ok .
2eme es que on peux avoir la taille des objet retrouver , si c'est le cas on peux faire saCode:
1
2
3
4
5
6
7
8
9
10
11 img=getsnapshot(webcam); BW = im2bw(img); imtool(BW); [B,L] = bwboundaries(BW); for i=1:L myMask = zeros(size(i)); myMask(i==10) = 1; img_objet(i) = myMask.*BW; imtool(img_objet(i)); end
3etapCode:
1
2
3
4 x=size(objet); if(x(1)/x(2)==coefficient) %alors c'est notre objet end
Code:
1
2
3 myMask = zeros(size(i)); myMask(i==10) = 1; img_objet(i) = myMask.*BW;
Tu peux essayer ceci si tu veux visualiser comment la fonction bwboundaries aura fragmenté ta découpe.
ATTENTION: il risque d'y avoir une bonne quantité d'objets, ce qui va ouvrir une quantité du figure... Tu peux éventuellement rajouter une condition sur la taille minimale de l'objet à afficher afin d'alléger tout ça (en commentaire ci dessous).
Pour connaître le nombre de pixel que compose chaque objet, tu peux par exemple faire find(length(L==i))Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 img=getsnapshot(webcam); BW = im2bw(img); imtool(BW); [B,L] = bwboundaries(BW); for i=1:length(B) % if length(find(L==i)) > X .... avec X le nombre de pixel minimum de l'objet myMask = zeros(size(i)); myMask(L==i) = 1; img_objet{i,1} = img; for i = 1:3 img_objet{i,1}(:,:,i) = img_objet{i,1}(:,:,i).*myMask; end figure; imshow(img_objet{i,1}); end